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 に答える