4

現在のJFrameを閉じるためにdispose()を使用するcloseWindow()メソッドがあります。ウィンドウを再度表示すると、コントロール(テキストボックス、リスト、テーブルなど)には、フレームをdispose():dしたときに存在していた以前の値が残っています...それはなぜですか?フレームを完全に閉じてクリアする別の方法はありますか?

これは、別のJFrameが別のウィンドウを表示するために使用するコードです。ここで何か間違ったことをしていますか?

@Action
public void showAddProductToOrderView() {

    if (addProductToOrderView == null) addProductToOrderView = new AddProductToOrderView(this);
    addProductToOrderView.setVisible(true);
}
4

2 に答える 2

5

ウィンドウを破棄しても、その子テキストコンポーネントはクリアされません。Disposeはネイティブリソースを解放します。java.awt.Windowのjavadocにも次のように記載されています。

ウィンドウとそのサブコンポーネントは、後でpackまたはshowを呼び出してネイティブリソースを再構築することにより、再び表示可能にすることができます。再作成されたウィンドウとそのサブコンポーネントの状態は、ウィンドウが破棄された時点でのこれらのオブジェクトの状態と同じになります(これらのアクション間の追加の変更は考慮されません)。

他の人が提案しているように、代わりに毎回新しいインスタンスを作成してください。それが高額な場合、ビューが表示されたときにサブコンポーネントをクリアするのが最善のオプションだと思います。たとえば、オーバーライドしますsetVisible

編集:ヌルチェックを削除して、毎回新しいフレームを作成します。

@Action
public void showAddProductToOrderView() {
    addProductToOrderView = new AddProductToOrderView(this);
    addProductToOrderView.setVisible(true);
}

再利用されているフレームに応じて何か他のものがあるかどうか、私はあなたのコードの残りについて知りません。たとえば、リスナーをアタッチしている場合は、リスナーがリークしないように、それらが登録解除されていることを確認してください。

于 2010-01-10T13:52:15.490 に答える
3

最も簡単な方法は、フレーム全体を(コンストラクターを使用して)再作成してから、を使用show()して再度表示することです。これにより、コンストラクターがコンポーネントを作成して配置すると仮定すると、まったく新しいコンポーネントのセットが得られます。

于 2010-01-10T13:39:42.983 に答える