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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java / Swing:从JPanel内部获取Window / JFrame相关的知识,希望对你有一定的参考价值。

如何获得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
}

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

答案

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

JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
另一答案

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();
另一答案
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
另一答案

正如其他评论员已经提到的那样,简单地投射到JFrame通常并不合适。这确实适用于大多数特殊情况,但我认为唯一正确的答案是f3 by icza在https://stackoverflow.com/a/25137298/1184842

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

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

以上是关于Java / Swing:从JPanel内部获取Window / JFrame的主要内容,如果未能解决你的问题,请参考以下文章

从 Java Swing 中的另一个类访问 JPanel 变量

Java Swing - JPanel 和 GridLayout 边距/填充

java swing编程问题:一个jframe中添加一个jpanel后,为jpanel添加一个滚动条,当jpanel中内容过多时滑动

java swing JPanel添加在JScrollPane上,有垂直的滚动条,可是滚动条拉到底,只显示了JPanel的一部分。

从 Java Swing 组件中检索对象

Java Swing 在单击我要删除的 jpanel 中存在的 Jbutton 时删除 Jpanel