2013-01-14 13 views
5

È il mio primo post qui, quindi perdonami se sto facendo qualcosa di sbagliato.I componenti Java Swing non hanno la dimensione corretta quando vengono aggiunti a JPanel

il mio problema è:

Sto cercando di aggiungere componenti a un JPanel con valori definiti per dimensioni, ecc Ma quando li aggiungere al pannello, che assolutamente non hanno la dimensione e la posizione che dovrebbe avere . Per esempio:

public class Console extends JFrame { 
    private JPanel mainPanel = new JPanel(); 
    private JTextArea textField = new JTextArea(); 
    private JTextArea textField2 = new JTextArea(); 

    public Console() { 
     this.setSize(500,300); 

     this.mainPanel.setSize(this.getWidth(),this.getHeight()); 

     this.textField.setEditable(false); 
     this.textField.setSize(this.mainPanel.getWidth(), 100); 
     this.textField.setPreferredSize(new Dimension(this.mainPanel.getWidth(),this.mainPanel.getHeight())); 
     this.textField.setLocation(0, 0); 
     this.textField.setText("some text"); 
     this.textField.setVisible(true); 

     this.textField2.setSize(this.mainPanel.getWidth(),200); 
     this.textField2.setPreferredSize(new Dimension(this.getWidth(),this.getHeight())); 
     this.textField2.setLocation(0,this.mainPanel.getHeight()-this.textField.getHeight()); 
     this.textField2.setText("blabla"); 
     this.textField2.setVisible(true); 

     this.mainPanel.add(textField); 
     this.mainPanel.add(textField2); 
     this.mainPanel.setVisible(true); 

     this.add(this.mainPanel); 
     // I know you should not call setVisible() in the Constructor, just for making Code more simple here. 
     this.setVisible(true); 
    } 
} 

Quando ho avvia l'applicazione, entrambi JTextArea di sono davvero piccole e da qualche parte nel mezzo (non come indicato sopra), mentre la mainPanel è correct.I provato a chiamare setSize() e setPreferredSize() in diversi Luoghi nel Codice, ma non ha funzionato. So che è meglio usare un LayoutManager per fare tutto ciò che ho sentito, ma ad essere onesti, non capisco come usarlo correttamente. L'ho controllato su Oracle Doc, ma sarei grato se qualcuno potesse pubblicare una soluzione pulita per questo, Grazie in anticipo.

+0

è necessario utilizzare 'Layout' corretto –

+0

Scusa se questo sembra stupido: Ma intendi setLayout()? Se è così, penso di dover, ad esempio, creare un GridLayout. Ma devo aggiungere i componenti a questo layout o come funziona? –

+0

Vedi le mie linee guida come risposta. –

risposta

6

È necessario impostare una corretta Layout per il vostro Container. È setLayout per un container come JFrame, JPanel e così via. Non si aggiungono altri componenti al layout, ma a un contenitore. Quindi li imposterà di conseguenza. È come funziona.

Con il layout corretto non è necessario chiamare setLocation(). Anche setVisible(true) è eccessivo, perché true è valori predefiniti per quei componenti nel codice.

Meglio non estendere JFrame, estendere JPanel invece e aggiungerlo a JFrame.

Si prega di conoscere EDT e SwingUtilities.invoketLater() è necessario utilizzarlo.

Inoltre è possibile salvare alcuni byte, non digitare this. tutto il tempo.

+0

Ha cercato SwingUtilities.invoketLater() e ha appreso che JPanel utilizza FlowLayout per impostazione predefinita :). Grazie –

+0

* "Puoi anche salvare alcuni byte, non digitando" questo "sempre." * È forse ironico che quando si utilizza un IDE completo automatico, ciò può effettivamente * salvare * sequenze di tasti, in quanto l'IDE farà apparire una lista di nomi di metodi. ;) +1 per la risposta, –

+1

@AndrewThompson, sì, è un po 'ironico. Penso che in Eclipse si possa premere Ctlr + Spazio per visualizzare l'elenco di metodi e campi senza digitare 'this'. –

2

riguarda il layout Swing layout.

+0

Grazie a te e Nikolay, lo controllerò di nuovo. Stavo leggendo qualcosa di sbagliato in Oracle Docs e l'ho appena realizzato ^^. Scusate. –

2

Per la vostra JTextArea problema, utilizzare:

 JTextArea j=new JTextArea(); 
     j.setColumns(20); 
     j.setRows(5); 

modificare i valori di setColumns() e setRows() per variare la dimensione; + il suggerimento dato circa Layout Managers.

Spero che questo funziona;)

+0

+1 alle informazioni o inizializzare 'JTextArea' con un [costruttore] corretto (http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html#JTextArea (int, % 20int)). Il layout non ha nulla a che fare con questo, dal momento che 'JPanel' ha per impostazione predefinita' FlowLayout', solo la tua risposta è troppo giusta per il problema in questione. –

+0

@GagandeepBali grazie mille gagan :) –

+0

Grazie a tutti e due :). –

-1

provare a utilizzare il layout assoluto di jpanel.

+0

Che cos'è il 'layout assoluto? Mai sentito prima. Anche se ti riferisci ad Absolute Positioning, allora per prima cosa dovresti provare a leggere il primo paragrafo di [Absolute Positioning] (http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html), per quanto riguarda i ** documenti Java ** devono dire riguardo a questo coso, per quanto possibile limitati a non usarlo. –

+1

-1 Questo è il peggior consiglio che si possa dare. Non dovresti quasi mai usare il layout assoluto. –