我有这个简单的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()));
}
}
问题是JPanel和JTextArea上的this.getWidth()
方法都返回0.似乎组件尚未初始化。你对修理它有什么想法吗?谢谢!
答案 0 :(得分:3)
不要设置文本字段的首选大小,尤其是不要使用引用面板大小的代码。此外,没有必要设置面板的首选尺寸。如果您的图像是50x50像素,FlowLayout将负责其余部分。
您可能应该使用JTextField构造函数,您可以在其中指定字符大小,这将确保JTextField水平地具有正确的大小。
答案 1 :(得分:1)
在验证所有组件之前,不会设置Swing组件的大小。 frame.pack()
所做的部分工作是验证组件。
您可以通过更改此行来解决您的紧急问题:
textField.setPreferredSize(new Dimension
(this.getWidth() - 50, this.getHeight()));
到
textField.setPreferredSize(new Dimension
(this.getPreferredWidth() - 50, this.getPreferredHeight()));