2012-03-10 9 views
57

JPanelが存在するJFrameを取得するにはどうすればよいですか?Java/Swing:JPanel内部からWindow/JFrameを取得

私の現在のソリューションは、私は窓を見つけるまで、それは(とように)親のためにパネルを依頼することです:

Container parent = this; // this is a JPanel 
do { 
    parent = parent.getParent(); 
} while (!(parent instanceof Window) && parent != null); 
if (parent != null) { 
    // found a parent Window 
} 

は、よりエレガントな方法はあります、標準ライブラリにおける方法であってもよいですか?

答えて

111

SwingUtilities.getWindowAncestor(...)メソッドを使用して、トップレベルの型にキャストできるウィンドウを返すことができます。

JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this); 
+1

これはSpring Controllerを使用してイベントをSwingに接続するのに役立ちます。 –

+0

クールで簡単、うまくいきます。 –

29
JFrame frame = (JFrame)SwingUtilities.getRoot(x); 
+0

これはこれを行う別の方法でもあり、うまくいくでしょう。 1+票。 –

+4

Javadocはこれが 'Applet'(' Window'や 'Frame'ではなく)であるかもしれないと述べています。 – icza

24

(それらのJavadocに記載されているように)同じ機能を提供SwingUtilitiesにおけるこの2直接、異なる方法があります。彼らはjava.awt.Windowを返しますが、パネルをJFrameに追加した場合は、それを安全にJFrameにキャストできます。

2つの直接的かつ最も簡単な方法:完全性については

JFrame f1 = (JFrame) SwingUtilities.windowForComponent(comp); 
JFrame f2 = (JFrame) SwingUtilities.getWindowAncestor(comp); 

いくつかの他の方法:

JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp); 
JFrame f4 = (JFrame) SwingUtilities.getRoot(comp); 
JFrame f5 = (JFrame) SwingUtilities.getRootPane(comp).getParent(); 
+0

これは最も完全で有用な答えです。 – lifeisfoo

1

他のコメンテーターは、すでに単ににキャストすることは一般に有効ではありません述べたようにJFrame。それは、ほとんどの特別な場合に作業を行いますが、私はこれが有効かつ安全なキャストであり、すべての他の回答と同じくらい簡単なので、唯一の正しい答えはhttps://stackoverflow.com/a/25137298/1184842

JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);

にiczaでf3だと思います。

関連する問題