【问题标题】:Java/Swing: Obtain Window/JFrame from inside a JPanelJava/Swing:从 JPanel 中获取 Window/JFrame
【发布时间】:2012-03-27 21:31:05
【问题描述】:

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

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

【问题讨论】:

    标签: java swing jframe swingutilities


    【解决方案1】:

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

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

    【讨论】:

    • 那行得通。你知道很多隐藏的东西,哦,满载鳗鱼的气垫船。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      JFrame frame = (JFrame)SwingUtilities.getRoot(x);
      

      【讨论】:

      • Javadoc 指出这可能是Applet(不是WindowFrame)。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-25
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多