Java/Swing: Erhalten Sie Window/JFrame aus einem JPanel

Lesezeit: 1 Minute

Benutzer-Avatar
schäbig

Wie bekomme ich den JFrame, in dem ein JPanel lebt?

Meine aktuelle Lösung besteht darin, das Panel nach seinem übergeordneten Element (und so weiter) 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 eine elegantere Möglichkeit, eine Methode in der Standardbibliothek zu finden?

Du könntest benutzen SwingUtilities.getWindowAncestor(...) -Methode, die ein Fenster zurückgibt, das Sie in Ihren Typ der obersten Ebene umwandeln können.

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

  • Das hat funktioniert. Du weißt viel Verborgenes, oh Luftkissenfahrzeug voller Aale.

    – Benutzer64141

    15. Mai 2020 um 20:23 Uhr

Benutzer-Avatar
Eis

Dafür gibt es 2 direkte, unterschiedliche Methoden SwingUtilities die dieselbe Funktionalität bieten (wie in ihrem Javadoc angegeben). Sie kehren zurück java.awt.Window aber wenn Sie Ihr Panel zu a hinzugefügt haben JFramekönnen Sie es sicher übertragen JFrame.

Die 2 direkten und einfachsten Wege:

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

Der Vollständigkeit halber noch 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();

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

  • Javadoc gibt an, dass dies eine sein könnte Applet (nicht Window oder Frame).

    – Eis

    5. August 2014 um 10:50 Uhr

Benutzer-Avatar
jan

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

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

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

1226340cookie-checkJava/Swing: Erhalten Sie Window/JFrame aus einem JPanel

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy