2

我有这个简单的 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。似乎组件尚未初始化。您对修复它有任何想法吗?谢谢!

4

2 回答 2

3

不要设置文本字段的首选大小,尤其是不要使用引用面板大小的代码。也没有必要设置面板​​的首选尺寸。如果您的图像是 50x50 像素,FlowLayout 将负责其余部分。

您可能应该使用 JTextField 构造函数,您可以在其中指定字符大小,这将确保您的 JTextField 在水平方向上具有正确的大小。

于 2012-09-20T19:13:07.407 回答
1

在验证所有组件之前,不会设置 Swing 组件的大小。部分工作frame.pack()是验证组件。

您可以通过更改此行来解决您的直接问题:

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

textField.setPreferredSize(new Dimension 
    (this.getPreferredWidth() - 50, this.getPreferredHeight()));
于 2012-09-20T19:17:36.583 回答