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
}
よりエレガントな方法はありますか、標準ライブラリのメソッドがありますか?
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();
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
他のコメンテーターが既に言及したように、単にJFrame
にキャストすることは一般的に有効ではありません。それはほとんどの特別な場合に機能しますが、正しい答えはf3
icza by https://stackoverflow.com/a/25137298/1184842
JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
これは、有効かつ安全なキャストであり、他のすべての答えとほぼ同じくらい簡単だからです。