Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Disegnare un JComponent utilizzando un altro JComponent

    Ciao a tutti, forse dal titolo non si capisce molto ma io ho un codice di questo tipo
    codice:
    class GraphicElement extends JComponent {
         
           private JButton button = new JButton();
    
           @Override
    	protected void paintComponent(Graphics g) {
    		//Usa il paint di button
    	}
    }
    Per necessità devo estendere JComponent (non posso estendere JButton) solo che in questo caso vorrei praticamente fare in modo che la mia classe sia un JButton ma come faccio a fargli disegnare un jbutton quando viene fatta la richiesta di disegnare il mio componente?
    E' possibile oppure dovrei affrontare la cosa diversamente?
    Coltiva Linux, Windows si pianta da solo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Disegnare un JComponent utilizzando un altro JComponent

    Originariamente inviato da loHacker
    Per necessità devo estendere JComponent solo che in questo caso vorrei praticamente fare in modo che la mia classe sia un JButton (una specie di ereditarietà multipla) ma come faccio a fargli disegnare un jbutton quando viene fatta la richiesta di disegnare il mio componente?
    Non so per quale motivo ti è venuto in mente questo. Comunque no, non dovresti farlo. Perché a livello di painting si potrebbe anche fare ma .... per il "comportamento" del JButton? Chi gestisce la "pressione" dei tasti di mouse/tastiera? E come li passeresti a JButton?

    No. Ogni componente Swing è un "contenitore" (derivando da java.awt.Container), pertanto puoi benissimo aggiungere il componente dentro il tuo GraphicElement (ovviamente valutando le questioni su layout manager e posizioni/dimensioni).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    EDIT:Postato 2 volte
    Coltiva Linux, Windows si pianta da solo!

  4. #4
    In realtà GraphicElement non estende direttamente JComponent ma estende un'altra classe che a sua volta estende JComponent.
    Quindi io devo estendo per forza estendere il JComponent in quanto estendo la classe intermedia.

    Solo che questo GraphicElement deve essere un JButton.
    Se il JComponent fosse un interfaccia avrei già risolto in quanto potrei rendere la classe intermedia una interfaccia e GraphicElement che implementa l'interfaccia ed estende il JButton.

    Se non mi sono spiegato bene questa è la struttura attuale:
    codice:
    class TopElement extends JComponent {
          public void elementMethod() {
                    //Some action 
          }
    }
    
    class GraphicElement extends TopElement {
           private JButton button = new JButton();
    
           @Override
           public void elementMethod() {
                    //Some action
           }
    
           @Override
    	protected void paintComponent(Graphics g) {
    		//Usa il paint di button
    	}
    }
    Se invece usassi una interfaccia funzionerebbe:
    codice:
    interface TopElement extends JComponentIf {
           public void elementMethod();
    }
    
    class GraphicElement extends JButton implements TopElement {
                 @Override
                 public void elementMethod() {
                    //Some action
                 }
    }
    Ovviamente JComponentIf non ce l'ho, dovrei scriverla per tutti i metodi di JComponent
    Coltiva Linux, Windows si pianta da solo!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da loHacker
    Solo che questo GraphicElement deve essere un JButton.
    Lo ripeto ... vorrei essere molto chiaro: GraphicElement non può "essere" un JButton!! Non lo può essere né a livello di ereditarietà (IS-A) perché GraphicElement deriva (indirettamente) da JComponent e né può esserlo "simulato" come pensavi tu, perché andresti incontro a grattacapi non indifferenti ... oltre a fare (ammesso sia tecnicamente fattibile) qualcosa di molto fumoso e poco "standard".

    GraphicElement può invece contenere in termini di relazione contenitore-componente un JButton.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Originariamente inviato da andbin
    Lo ripeto ... vorrei essere molto chiaro: GraphicElement non può "essere" un JButton!! Non lo può essere né a livello di ereditarietà (IS-A) perché GraphicElement deriva (indirettamente) da JComponent e né può esserlo "simulato" come pensavi tu, perché andresti incontro a grattacapi non indifferenti ... oltre a fare (ammesso sia tecnicamente fattibile) qualcosa di molto fumoso e poco "standard".

    GraphicElement può invece contenere in termini di relazione contenitore-componente un JButton.
    Ok e quindi come potrei risolvere il problema?
    Dici che posso fare TopElement come interfaccia e GraphicElement che estende direttamente il JButton e implementa TopElement.
    Solo che poi ogni volta che uso un TopElement devo verificare che sia un JComponent e fare il cast per poterlo disegnare e però sarebbe peggio perchè in caso di errore si avrebbe a runtime.
    codice:
    interface TopElement {
           public void elementMethod();
    }
    
    class GraphicElement extends JButton implements TopElement {
                 @Override
                 public void elementMethod() {
                    //Some action
                 }
    }
    Coltiva Linux, Windows si pianta da solo!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da loHacker
    Ok e quindi come potrei risolvere il problema?
    Ma se non so (e non l'hai spiegato) perché stai facendo queste questioni e cosa vuoi realizzare .... come faccio a saperlo?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Originariamente inviato da andbin
    Ma se non so (e non l'hai spiegato) perché stai facendo queste questioni e cosa vuoi realizzare .... come faccio a saperlo?
    Ok , io pratica devo realizzare degli oggetti (ad es. GraphicElement) che possano essere aggiunti ad un JPanel e quindi devono essere dei JComponent, solo che il più devo avere le funzionalità definite da TopElement.
    Sarebbe anche semplice solo che nella funzione che li utilizza come tipo viene usato TopElement e quindi posso controllare il tipo a compile time.
    Però se è un JComponent posso verificarlo solo a runtime visto che non c'è alcuna relazione tra TopElement e JComponent e quindi il compilatore non può eseguire controlli sui tipi.
    Coltiva Linux, Windows si pianta da solo!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.