2

私は拡張するクラスを持っていますjavax.swing.JPanel、それは単一のJButtonを含みます。NetBeansデザイナでクラスを作成しました。そのためinitComponents()、クラスコンストラクターから呼び出される関数があります。

関数が呼び出されたとき/場合は、2つ目のボタンを追加し、2つのボタンのレイアウトを変更したいと思います。簡単に行う:

public void addSecond() {
    javax.swing.JButton secondButton = new javax.swing.JButton();
    add(secondButton , java.awt.BorderLayout.CENTER);
}

動作しません。新しいボタンは表示されません。私も電話をかけてみinvalidate()ましたが、運がありませんでした。

  • レイアウトの再評価をトリガーするにはどうすればよいですか?
  • 上記の関数が複数回呼び出された場合、レイアウト/ボタンのどの部分でdispose()を呼び出す必要がありますか?私が心配すべき他のクリーンアップはありますか?
  • NetBeansデザイナを使用しない場合、これは扱いやすくなりますか?
4

2 に答える 2

1

レイアウトを変更する方法でコンポーネントを変更した場合は、 を呼び出してレイアウト マネージャーを再度トリガーする必要がありますrevalidate()。何度でも呼び出すことができます。
単純なレイアウトの場合は、呼び出すだけrepaint()で十分な場合があります。

実際、パネルを動的に変更する (つまり、その場でコンポーネントを追加/削除する) 場合を除き、netbeans デザイナを使用する必要があるため、すべての Swing 要素が 1 か所にあります。

-- 編集 --また、パネルごとに BorderLayout.CENTER
に配置できるコンポーネントは1 つだけです。パネルの同じ位置に複数の要素を配置した場合、ペイントされるものが明確に定義されていません。つまり、いずれかの要素 (または両方) である可能性があります。

于 2010-02-02T10:15:31.387 に答える
1

でボタンを追加する前に、パネルのレイアウトを設定する必要がありますBorderLayout.CENTER。また、最初のボタンを削除して再度追加revalidate()し、パネルでメソッドを呼び出す必要があります。

以下のように addSecond() メソッドを変更すると、動作するはずです。

private void addSecond() {
    JButton secondButton = new JButton("Button - 2");

    this.setLayout(new BorderLayout());
    remove(firstButton);
    add(firstButton, BorderLayout.NORTH);
    add(secondButton, BorderLayout.CENTER);

    revalidate();
}
于 2010-02-02T10:17:18.250 に答える