Java / Swing: Beziehen Sie Window / JFrame aus einem JPanel heraus

73

Wie kann ich den JFrame erhalten, in dem ein JPanel lebt?

Meine aktuelle Lösung besteht darin, das Panel nach dem übergeordneten Element (usw.) zu fragen, bis ich ein Fenster finde:

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

Gibt es einen eleganteren Weg, eine Methode in der Standardbibliothek?

Scravy
quelle

Antworten:

137

Sie können eine SwingUtilities.getWindowAncestor(...) Methode verwenden, die ein Fenster zurückgibt, das Sie in Ihren Top-Level-Typ umwandeln können.

JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
Luftkissenfahrzeug voller Aale
quelle
1
Das hat funktioniert. Du weißt viel, was verborgen ist, oh Luftkissenfahrzeug voller Aale.
user64141
40

Hierfür gibt es zwei direkte, unterschiedliche Methoden SwingUtilities, die dieselbe Funktionalität bieten (wie in ihrem Javadoc angegeben). Sie kehren zurück, java.awt.Windowaber wenn Sie Ihr Panel zu a hinzugefügt haben JFrame, können Sie es sicher umwandeln JFrame.

Die 2 direkten und einfachsten Wege:

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

Der Vollständigkeit halber einige andere Möglichkeiten:

JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
JFrame f4 = (JFrame) SwingUtilities.getRoot(comp);
JFrame f5 = (JFrame) SwingUtilities.getRootPane(comp).getParent();
icza
quelle
30
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
Ismael Abreu
quelle
6
Javadoc gibt an, dass dies ein Applet(nicht Windowoder Frame) sein könnte.
icza
3

Wie andere Kommentatoren bereits erwähnt haben, ist es nicht allgemein gültig, einfach zu besetzen JFrame. Das funktioniert in den meisten Sonderfällen, aber ich denke, die einzig richtige Antwort ist f3von icza in https://stackoverflow.com/a/25137298/1184842

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

weil dies eine gültige und sichere Besetzung ist und fast so einfach wie alle anderen Antworten.

jan
quelle