2012-01-08 14 views
6

Quando ho appreso la creazione di Java GUI: s nel mio primo corso di Java, mi è stato insegnato per creare le mie finestre come JFrame casi, e quindi aggiungere un JPanel ad ogni JFrame e, infine, aggiungere tutti i componenti GUI al JPanel:Devo aggiungere componenti a un JFrame o al suo contentPane?

class Example extends JFrame { 
    Example() { 
     JPanel panel = new JPanel(); 
     this.add(panel); 

     // Create components here and add them to panel 
     // Perhaps also change the layoutmanager of panel 

     this.pack(); 
     this.setVisibility(true); 
    } 

    public static void main(String[] args) { 
     new Example(); 
    } 
} 

Ho sempre pensato che "beh, questo odora un po ', non mi piace creare un oggetto extra solo per essere un contenitore", ma non sapevo nessun altro modo per farlo, quindi ho continuato. Fino a poco tempo fa, quando mi sono imbattuto su questo "modello":

class AnotherExample extends JFrame { 
    AnotherExample() { 
     Container pane = this.getContentPane(); 

     // Add components to and change layout of pane instead 

     this.pack(); 
     this.setVisibility(true); 
    } 

    public static void main(String[] args) { 
     new AnotherExample(); 
    } 
} 

ancora in fase del tutto nuova a Java, mi sento meglio con il secondo approccio solo perché non comporta la creazione di un JPanel solo per avvolgere gli altri componenti. Ma quali sono le reali differenze tra gli approcci, ad eccezione di quello? Qualcuno di loro ha grandi benefici rispetto all'altro?

+1

Leggi questo tutorial per maggiori informazioni: http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html –

+0

Grande tutorial! Consiglio a chiunque trovi questa domanda di leggerlo. –

+0

non importa (entrambi sono cattivi, non c'è bisogno di farlo, basta aggiungere al frame) - il vero odore è _extends JFrame_: buon vecchio OO regola è di estendere solo se c'è un suono è-una relazione (vs. semplice utilizzo, come nel caso del 99,99% in tutte le applicazioni GUI) – kleopatra

risposta

4

Preferisco creare un JPanel (che, essendo un contenitore Swing, può avere un bordo) e impostare come riquadro del contenuto.

Per ottenere un JComponent dal riquadro del contenuto è necessario eseguire il cast, che ha un odore ancora peggiore rispetto alla creazione di un componente aggiuntivo.

+0

... e perché lo fai? Cosa rende questo approccio migliore (o diverso) rispetto ai due che ho postato? –

+0

E a proposito: buona idea! Questo è probabilmente l'approccio I (ignorante dei fatti reali) come il migliore finora =) –

+0

Immagino che il primo commento sia stato fatto prima di aver modificato la mia risposta. Dopo averlo inviato, rileggo la domanda per vedere che la mia risposta ... non ha risposto. ;) –

Problemi correlati