2013-01-14 62 views
5

這是我的第一篇文章,請原諒我,如果我做錯了什麼。Java Swing組件在添加到JPanel時沒有正確的大小

我的問題是:

我試圖用組件定義的值添加到JPanel的大小等 但是,當我將它們添加到面板上,他們絕對沒有大小和位置,他們應該有。 例如:

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); 
    } 
} 

當我啓動應用程序,無論是JTextArea中的確實小,在中間的某個位置(不是上面設置),而mainPanel中被correct.I試圖打電話的setSize(),並有必要對setPreferredSize()在守則的不同地方,但它沒有奏效。我知道最好使用LayoutManager來做到這一點,據我所知,但說實話,我不知道如何正確使用它。我在Oracle Doc上檢查過它,但是如果有人可以爲此發佈一個乾淨的解決方案,我將不勝感激,謝謝。

+0

你需要使用正確的'佈局' –

+0

對不起,如果這聽起來很愚蠢:但你的意思是setLayout()?如果是這樣,我想我必須,例如,創建一個GridLayout。但是,我必須將組件添加到此佈局還是它​​如何工作? –

+0

查看我的指導方針作爲答案。 –

回答

6

您需要設置一個適當的LayoutContainer。您爲JFrameJPanel等容器setLayout等。您不要將其他組件添加到佈局,而是添加到容器。然後它會相應地佈置它們。它是如何工作的。

如果佈局正確,則不需要撥打setLocation()setVisible(true)也是過度的,因爲true是代碼中這些組件的默認值。

最好不要延長JFrame,而應該延伸JPanel,並將其添加到JFrame中。

請了解有關EDT和SwingUtilities.invoketLater()的信息,您需要使用它。

也可以保存一些字節,而不是一直鍵入this.

+0

搜索了SwingUtilities.invoketLater(),並瞭解到JPanel默認使用FlowLayout :)。謝謝 –

+0

*「你也可以節省一些字節,而不是一直輸入'this.'。」*使用自動完成的IDE時,這實際上可以*保存*擊鍵,這可能很諷刺,因爲IDE會彈出一個方法名稱列表。 ;)+1爲你的答案, –

+1

@AndrewThompson,是的,這是有點諷刺。我認爲在Eclipse中,可以按Ctlr + Space查看方法和字段列表,而不用鍵入'this.'。 –

2

這一切都是關於佈局Swing layout

+0

感謝你和尼古拉,我會再次檢查它。在Oracle Docs中讀了某處錯誤,並意識到它^^。抱歉。 –

2

爲了您JTextArea問題,使用:

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

變化setColumns()setRows()值來改變大小; +關於Layout Managers的建議。

希望這個作品;)

+0

對信息+1,或用適當的[構造函數]初始化JTextArea(http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html#JTextArea(int, %20int))。佈局與此無關,因爲'JPanel'默認具有'FlowLayout',只是你的答案與當前問題有關。 –

+0

@GagandeepBali謝謝你這麼多gagan :) –

+0

謝謝你們兩個:)。 –

-1

嘗試使用jpanel的絕對佈局。

+0

什麼是絕對佈局?從未聽說過它。雖然如果您提到絕對定位,那麼首先,您應該嘗試閱讀[絕對定位](http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html)的第一段, ** Java Docs **必須對這件事說,儘可能地限制自己不使用它。 –

+1

-1這是最糟糕的建議。你幾乎不應該使用絕對佈局。 –

相關問題