webentwicklung-frage-antwort-db.com.de

Java / Swing: Hole Window / JFrame aus einem JPanel

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

Meine derzeitige 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 verwenden?

68
scravy

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

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

In SwingUtilities gibt es zwei direkte, unterschiedliche Methoden, die die gleiche Funktionalität bieten (wie in ihrem Javadoc angegeben). Sie kehren zurück Java.awt.Window aber wenn Sie Ihr Panel zu einem JFrame hinzugefügt haben, können Sie es sicher in JFrame umwandeln.

Die 2 direktesten 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();
35
icza
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
30
Ismael Abreu

Wie andere Kommentatoren bereits erwähnt haben, ist es nicht allgemein gültig, einfach nach JFrame zu casten. Das funktioniert in den meisten Sonderfä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.

1
jan