7

私は、この質問がここのように SO で非常に頻繁に現れることを知っています:しかし、私はいくつかの非常に具体的な例を提示したいと思います...私は物事を正しくするかどうかはわかりません.

私はいくつかの値を入力したり、いくつかのチェックボックスを選択したりできる JDialog を持っています。

JDialogを呼び出し/作成するJFrameでは:

MyDialog d = new MyDialog(this, ...);
d.showDialog();
// After MyDialog is closed (it's modal):
MyDialog.Response dialogResponse = d.getDialogResponse();
// Do something with response...

ダイアログ内 (ダイアログは [保存] ボタンをクリックして閉じることができます):

btnSave.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        dialogResponse = prepareResponse(); // prepares response on the basis of some data introduced by a user; dialogResponse is called from JFrame after Dialog is closed
        setVisible(false);
        dispose();  // <-- Important
    }
});

私の質問は次のとおりです:この解決策は機能します。つまり、行MyDialog.Response dialogResponse = d.getDialogResponse();は適切な値を返しますが、... dispose() を使用してダイアログを閉じると、すべてのダイアログのリソースをガベージ コレクションできます (必要はありません... 予測するのは難しいです) 、私は正しいですか?)。それで、ダイアログの応答をそのように取得するのは正しいですか...おそらく、この場合は setVisible(false);なしでのみ書くべきdispose()です。

4

4 に答える 4

8

Javadocsから引用:

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

したがって、あなたの応答は保持されます。ネイティブのdispose()画面リソースを解放するだけで、他のメンバーはガベージ コレクションの対象としてマークされません。

また、さらに確実にしたい場合dispose()は、応答オブジェクトを取得した直後に呼び出すことができます。

于 2013-08-20T08:43:47.987 に答える
-1

クラス変数 (private static または public static) を使用せず、ファクトリ メソッドを使用する理由

  //it can be an object too public static Object  getResponseValue()
  public static Integer  getResponseValue(){
    myclassContainer container = new myclassContainer(someparent,modal).setvisible(true)
     return      Myfieldvalue
    }

    private static int Myfielvalue;

}
于 2014-03-03T01:58:33.007 に答える