对JPanel进行子类化并获得他的大小

时间:2012-09-20 19:06:24

标签: java swing 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()));

    }

}

问题是JPanel和JTextArea上的this.getWidth()方法都返回0.似乎组件尚未初始化。你对修理它有什么想法吗?谢谢!

2 个答案:

答案 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()));