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
}

是否有一个更优雅的方法,在标准库中的方法可能是?

89117 次浏览

可以使用 SwingUtilities.getWindowAncestor(...)方法返回一个可以强制转换为顶级类型的 Window。

JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
JFrame frame = (JFrame)SwingUtilities.getRoot(x);

SwingUtilities中有两个直接的、不同的方法,它们提供了相同的功能(正如它们的 Javadoc 中所指出的那样)。它们返回 java.awt.Window,但是如果您将面板添加到 JFrame,您可以安全地将其转换为 JFrame

两种最直接和最简单的方法:

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是不正确的。这在大多数特殊情况下确实有效,但是我认为唯一正确的答案是 f3 by icza in https://stackoverflow.com/a/25137298/1184842

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

因为这是一个有效和安全的演员阵容,几乎和所有其他答案一样简单。