Java / Swing:从JPanel内部获取Window / JFrame


75

如何获得JPanel所在的JFrame?

我当前的解决方案是询问面板的父面板(依此类推),直到找到Window:

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

标准库中有没有更优雅的方法?

Answers:


139

您可以使用SwingUtilities.getWindowAncestor(...) 将返回可转换为顶级类型的Window的方法。

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

2
那行得通。气垫船充满鳗鱼,你知道很多隐藏的东西。
user64141

40

有两种直接的,不同的方法SwingUtilities可提供相同的功能(如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();


3

正如其他评论员已经提到的那样,简单地转换为,通常是无效的JFrame。这在大多数特殊情况下确实有效,但我认为唯一正确的答案是f3icza,网址为https://stackoverflow.com/a/25137298/1184842

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

因为这是一种有效且安全的方法,几乎​​与所有其他答案一样简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.