2014-09-15 37 views
9

Quando utilizzareChe cosa fa getContentPane() esattamente?

Container c = getContentpane(); 

& quando utilizzare

frame.getcontentpane(); 
+2

Eh? Puoi dare un esempio di ciascuno? Cosa ti ha detto l'API? –

+0

il mio programma di libri di testo utilizza solo frame.getcontentpane .. ma mentre effettivamente implementandolo non funziona. Devo usare con = getcontentpane() .. mi diresti il ​​meccanismo di getcontentpane .. potrebbe chiarire tutti i miei dubbi. –

+0

Puoi pubblicare un po 'del tuo codice? La classe che stai chiamando getContentPane() nel primo esempio estende JFrame? – mdewitt

risposta

9

Se il codice fa parte di una sottoclasse JFrame, è necessario utilizzare getContentPane(). Se il codice non fa parte del frame (forse sei nel metodo static main() per l'applicazione), allora devi usare un oggetto JFrame per chiamare getContentPane(); questo è ciò che fa frame.getContentPane().

Esempi:

public class TestApp extends JFrame { 
    public static void main(String[] args) { 
     TestApp frame = new TestApp(); 
     Container c = frame.getContentPane(); 
     // do something with c 
     frame.pack(); 
     frame.show(); 
    } 

    /* constructor */ 
    public TestApp() { 
     Container c = getContentPane(); // same as this.getContentPane() 
     // initialize contents of frame 
    } 
} 
+0

questo frame di cui sto parlando non è una variante della classe utente .. è della classe JFrame –

+0

@ChinmayKale - Sì, avrei dovuto rendermene conto. 'getContentPane()' è un metodo Swing. Penso che tu abbia avuto l'idea di base, comunque. –

+0

Quindi possiamo fare lo stesso gui con la classe Solo contenitore o Solo classe Jframe? non importa? –

1

Beh, io could direct to the api:

restituisce l'oggetto contentPane per questo telaio.

It's all part of the gui initialization process. protocollo di Java in realtà, certamente un po 'boilerplate per ottenere l'interfaccia grafica up:

public class FlowLayoutExample extends JApplet { 

    public void init() { 
    getContentPane().setLayout(new FlowLayout()); 
    getContentPane().add(new JButton("One")); 
    getContentPane().add(new JButton("Two")); 
    getContentPane().add(new JButton("Three")); 
    getContentPane().add(new JButton("Four")); 
    getContentPane().add(new JButton("Five")); 
    getContentPane().add(new JButton("Six")); 
    } 
} 

-Source

Ma in sostanza, stiamo ottenendo lo strato riquadro del contenuto in modo che in seguito sarà possibile aggiungere un oggetto ad esso. See this for more details.

1

Probabilmente si sta estendendo JFrame il che significa che la classe erediterà i metodi da JFrame. Come tale, il codice può sembrare un po 'come il seguente:

public class MyClass extends JFrame { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new MyClass(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public MyClass() { 
     ... 
     Container c = getContentPane(); 
    } 
} 

Nell'esempio di cui sopra, non v'è alcuna necessità di utilizzare frame.getContentPane() perché si eredita i metodi di JFrame. In altre parole, è sufficiente scrivere getContentPane(). In alternativa, nella maggior parte dei casi, si dovrebbe in realtà essere un'istanza un nuovo JFrame come una variabile di istanza a meno che non si sta in realtà l'aggiunta di nuove funzionalità per la classe JFrame:

public class MyClass { 
    private JFrame frame; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new MyClass(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public MyClass() { 
     ... 
     Container c = frame.getContentPane(); 
    } 
} 
0

Se estendiamo JFrame allora possiamo usare getContentPane() metodo diretto nel nostro oggetto BoxLayout. Ma se applichiamo una regola di associazione (significa che creiamo un oggetto di JFrame nel nostro codice, ovvero JFrame f=new JFrame()), dobbiamo creare un oggetto Contenitore e passare questo oggetto in BoxLayout() come argomento.

  1. Quando ci si estende JFrame:

    public class BoxLayOutTest extends JFrame { 
        public BoxLayOutTest() { 
         // TODO Auto-generated constructor stub 
         setSize(300, 400); 
         setVisible(true); 
         getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS)); 
         JButton b1 = new JButton("One"); 
         JButton b2 = new JButton("Two"); 
         JButton b3 = new JButton("Three"); 
         JButton b4 = new JButton("Four"); 
         JButton b5 = new JButton("Five"); 
    
         add(b1); 
         add(b2); 
         add(b3); 
         add(b4); 
         add(b5); 
        } 
    
        public static void main(String[] args) { 
         new BoxLayOutTest(); 
        } 
    } 
    
  2. Se creiamo JFrame oggetto all'interno del codice:

    public class TwoPanelinFrame { 
        JFrame f; 
    
        public TwoPanelinFrame() { 
         f = new JFrame("Panel Test"); 
         f.setSize(600, 600); 
         f.setVisible(true); 
         Container c = f.getContentPane(); 
         f.getContentPane().setLayout(new BoxLayout(c, BoxLayout.X_AXIS)); 
    
         JButton b2 = new JButton("One"); 
         JButton b3 = new JButton("One"); 
         JButton b4 = new JButton("One"); 
         JButton b5 = new JButton("One"); 
    
         f.add(b2); 
         f.add(b3); 
         f.add(b4); 
         f.add(b4); 
        } 
    
        public static void main(String[] args) { 
         new TwoPanelinFrame(); 
        } 
    } 
    
4
getContentPane().setBackground(Color.YELLOW); 

Questa riga di codice è difficile da capire e il tutor getterà le basi per comprenderlo pienamente mentre continui a studiare Java. Prima di considerare è la regola sulla modifica di un oggetto-40-con un metodo . Sul lato sinistro di un periodo è un oggetto , e il metodoche modifica l'oggetto è sul lato destro del periodo . Questa regola si applica qui.

A contenitore ha diversi livelli in esso. Puoi pensare a un livello come una pellicola trasparente che si sovrappone al contenitore . In Java Swing, il livello utilizzato per contenere oggetti è chiamato il riquadro del contenuto . Gli oggetti vengono aggiunti al livello del riquadro del contenuto del contenitore. Il metodo getContentPane() recupera il livello del riquadro del contenuto in modo che sia possibile aggiungervi un oggetto. Il riquadro del contenuto è un oggetto creato dall'ambiente di esecuzione Java. Non è necessario conoscere il nome del riquadro del contenuto per utilizzarlo. Quando si utilizza getContentPane(), l'oggetto del riquadro del contenuto viene quindi sostituito in modo che sia possibile applicarvi un metodo. In questa riga di codice, non stiamo aggiungendo un oggetto al riquadro del contenuto. Piuttosto, stiamo facendo in modo che il colore del riquadro del contenuto sia giallo. Questa linea di codice è ciò che cambia il colore predefinito, bianco, in giallo, e potresti ricordare di vedere il rettangolo giallo nell'esempio in cui il programma è in esecuzione in un browser. Questa linea di codice è ciò che ha reso quella zona rettangolare gialla.

Un modo di pensare a questo è pensare che l'oggetto riquadro del contenuto viene sostituito per il metodogetContentPane(), in questo modo:

contentpaneobject.setBackground(Color.YELLOW); 

Anche se non hai mai veramente vedere quanto sopra dichiarazione, hai la funzionalità della dichiarazione . Quando si recupera riquadro contenuti con il metodogetContentPane(), è possibile quindi modificare il riquadro oggetto contenuti, che viene arbitrariamente chiamato contentpaneobject nell'esempio di cui sopra. In questa dichiarazione, la modifica è di cambiare il colore del riquadro del contenuto. Questo passaggio viene presentato di seguito nel tutor.

Avviso il modulo getContentPane() come metodo . Il metodo inizia con una lettera minuscola e ha parentesi. Le parentesi sono vuote.

enter image description here

enter image description here

Problemi correlati