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的一部分。