Java/Swing: Obtain Window/JFrame from inside a JPanel

前端 未结 4 899
不知归路
不知归路 2020-11-30 00:59

How can I get the JFrame in which a JPanel is living?

My current solution is to ask the panel for it\'s parent (and so on) until I find a Window:

Con         


        
相关标签:
4条回答
  • 2020-11-30 01:24
    JFrame frame = (JFrame)SwingUtilities.getRoot(x);
    
    0 讨论(0)
  • 2020-11-30 01:36

    There are 2 direct, different methods for this in SwingUtilities which provide the same functionality (as noted in their Javadoc). They return java.awt.Window but if you added your panel to a JFrame, you can safely cast it to JFrame.

    The 2 direct and most simple ways:

    JFrame f1 = (JFrame) SwingUtilities.windowForComponent(comp);
    JFrame f2 = (JFrame) SwingUtilities.getWindowAncestor(comp);
    

    For completeness some other ways:

    JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
    JFrame f4 = (JFrame) SwingUtilities.getRoot(comp);
    JFrame f5 = (JFrame) SwingUtilities.getRootPane(comp).getParent();
    
    0 讨论(0)
  • 2020-11-30 01:44

    As other commentators already mentioned it is not generally valid to simply cast to JFrame. That does work in most special cases, but I think the only correct answer is f3 by icza in https://stackoverflow.com/a/25137298/1184842

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

    because this is a valid and safe cast and nearly as simple as all other answers.

    0 讨论(0)
  • 2020-11-30 01:50

    You could use SwingUtilities.getWindowAncestor(...) method that will return a Window that you could cast to your top level type.

    JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
    
    0 讨论(0)
提交回复
热议问题