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?

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

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

30
JFrame frame = (JFrame)SwingUtilities.getRoot(x);

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.