2012-02-08 1 views
3

シングルトンにすることなくアプリケーション全体でトップレベルのコンテナ(たとえばJFrame)を参照するにはどうすればよいですか?私が尋ねる理由は、私がシングルトン反パターンを避けようとしていることです。シングルトンにすることなく、アプリケーション全体で最上位のコンテナを参照する方法は?

とにかく、私は、ユーザーに簡単なメッセージを表示するには、別のトップレベルのコンテナ(例えばJDialog)を必要とするときがわかり、私は、このダイアログはsetLocationRelativeTo(frame)を使用して、前述のJFrameの上に直接配置することにしたいです。しかし私がそうすることができる唯一の方法は(現時点で)JFrameの単一のインスタンスを作成し、静的なgetInstanceメソッドを使用してアクセスすることです。

したがって、シングルトンパターンに頼らなくてもトップレベルのコンテナを参照する方法はありますか?誰かがもっと情報を必要としている場合は私にお知らせください!

ありがとうございました。

+0

場合はシングルトンに何か問題がありませんそれはあなたが望むふるまいです。この問題は、グローバル変数を持つようにSingletonのみを実装し、どこでも使用できるようにするときに発生します。 – cdeszaq

答えて

4

Eventオブジェクト(ActionEventなど)メソッドから取得できるような、最上位レベルのウィンドウに保持されているSwingコンポーネントへの参照がある場合は、これを使用して、 SwingUtilities方法:

SwingUtilities.getWindowAncestor(anyComponent); 

また、このクラスは、そうでない場合、あなたは常に、コンストラクタやセッターのパラメータを経由して参照を渡すことができ、そのようなwindowForComponent(Component c)getDeepestComponentAt(...)getRoot(Component c)

として他の有用なと同様の方法があります。

+0

(正当性チェックのみ) 'JFrame'にある' JPanel'に 'JButton'がある場合、' JButton'でこのメソッドを呼び出すと 'JFrame'が返されますか? 'JPanel'は' Window'ではないので、** yes **と答えると思いますが、専門家に尋ねるのは怪しいと思いました! :D – mre

+0

@mre:はい、あなたのケースではJFrameになるトップレベルのウィンドウを返します。 –

+2

['JComponent.getTopLevelAncestor()'](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#getTopLevelAncestor%28%29)も参照してください。 +1は 'gWA()'へのポインタです - その日の私の学習項目。 :) –

2

1) Top-level Containersの全てであり、デフォルトで

Window[] allWindows = Window.getWindows(); 

を配置含むTop-level Containersの現在のJVMインスタンスでき戻りアレイづけしとre_use

2の準備)に配置されたなどのJFrameでき戻り、すべてのチャイルズ、気付いた場合は2.nd以上JFramesがあり、必要な使い方getWindows()

Window[] allWindows = Window.getOwnedWindows(); 
関連する問題