86

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:

Container parent = this; // this is a JPanel
do {
    parent = parent.getParent();
} while (!(parent instanceof Window) && parent != null);
if (parent != null) {
    // found a parent Window
}

Is there a more elegant way, a method in the Standard Library may be?

mKorbel
  • 109,525
  • 20
  • 134
  • 319
scravy
  • 11,904
  • 14
  • 72
  • 127

4 Answers4

163

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);
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
44

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();
icza
  • 389,944
  • 63
  • 907
  • 827
30
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
Ismael Abreu
  • 16,443
  • 6
  • 61
  • 75
6

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.

zx485
  • 28,498
  • 28
  • 50
  • 59
jan
  • 2,741
  • 4
  • 35
  • 56