2012-09-20 15 views
1

我已經這個簡單的JPanel子類:子類JPanel並得到他的大小

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class SearchTextField extends JPanel 
{ 

    private ImageIcon image; 
    private JTextField textField; 

    SearchTextField() 
    { 

     this.setLayout(new FlowLayout()); 

     image = new ImageIcon ("img/search.png"); 
     textField = new JTextField ("test"); 

     JLabel label = new JLabel(image); 

     this.add(label,FlowLayout.LEFT); 
     this.add(textField, FlowLayout.CENTER); 

     this.setPreferredSize(new Dimension (250,50)); 

     textField.setPreferredSize(new Dimension (this.getWidth() - 50, this.getHeight())); 

    } 

} 

的問題是this.getWidth()方法無論在JPanel並JTextArea中返回0。看來,該組件尚未初始化。你有解決它的任何想法嗎?謝謝!

+2

[我應避免使用一套(首選|最大|最小)中的Java Swing大小的方法] (http://stackoverflow.com/q/7229226/230513)? – trashgod

+0

[JTextField(String text,int columns)](http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextField.html#JTextField%28java.lang.String,%20int%29 )和'JPanel'已經在'API'中將'FlowLayout'作爲默認的'LayotManager'實現了。 – mKorbel

回答

3

不要設置文本字段的首選大小,特別是不要使用引用面板大小的代碼。此外,沒有必要設置面板​​的首選尺寸。如果您的圖像是50x50像素,FlowLayout將負責其餘部分。

您可能應該使用JTextField構造函數,您可以在其中指定字符大小,這將確保水平方向上JTextField具有合適的大小。

1

只有在所有組件都經過驗證之後,纔會設置Swing組件的大小。 frame.pack()所做的一部分是驗證組件。

您可以通過更改此行能夠立即解決的問題:

textField.setPreferredSize(new Dimension 
    (this.getWidth() - 50, this.getHeight())); 

textField.setPreferredSize(new Dimension 
    (this.getPreferredWidth() - 50, this.getPreferredHeight())); 
+0

真的是一個非常有用的解決方法!也許你也有我的原始問題的解決方案:當我調整JPanel以適合他的大小並減去固定值時,我不會調整JTextField的大小。謝謝! – Luca

+0

@Luca:你必須使用佈局管理器,而不是自己計算大小。由於在JPanel中只有一個組件,因此可以使用BorderLayout。將文本字段放在BorderLayout的中心。 http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html –

+0

我的佈局中有兩個組件,一個是JLabel和JTextField。我試着用'LINE_START'中的BorderLayout和'CENTER'中的JextField進行嘗試,但這不起作用 – Luca