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

2022-08-31 12:18:27

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

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


答案 1

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

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

答案 2

有2种直接的,不同的方法可以提供相同的功能(如其Javadoc中所述)。它们会返回,但是如果您将面板添加到 ,则可以安全地将其投射到 。SwingUtilitiesjava.awt.WindowJFrameJFrame

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();

推荐