web-dev-qa-db-ja.com

Java / Swing:JPanel内からWindow / JFrameを取得します

JPanelが存在する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
}

よりエレガントな方法はありますか、標準ライブラリのメソッドがありますか?

68
scravy

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

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

SwingUtilitiesには、同じ機能を提供する2つの直接の異なるメソッドがあります(Javadocに記載されています)。これらは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();
35
icza
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
30
Ismael Abreu

他のコメンテーターが既に言及したように、単にJFrameにキャストすることは一般的に有効ではありません。それはほとんどの特別な場合に機能しますが、正しい答えはf3 icza by https://stackoverflow.com/a/25137298/1184842

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

これは、有効かつ安全なキャストであり、他のすべての答えとほぼ同じくらい簡単だからです。

1
jan