Java / Swing: Obtenir Window / JFrame à partir d'un JPanel


Comment puis-je obtenir le JFrame dans lequel un JPanel vit?

Ma solution actuelle est de demander au panneau son parent (et ainsi de suite) jusqu'à ce que je trouve une fenêtre:

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

Existe-t-il un moyen plus élégant, une méthode dans la bibliothèque standard peut être?

Author: mKorbel, 2012-03-11

4 answers

Vous pouvez utiliser la méthode SwingUtilities.getWindowAncestor(...) qui renverra une fenêtre que vous pourriez convertir en votre type de niveau supérieur.

JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
 118
Author: Hovercraft Full Of Eels, 2012-03-10 22:55:42

Il existe 2 méthodes directes et différentes pour cela dans SwingUtilities qui fournissent la même fonctionnalité (comme indiqué dans leur Javadoc). Ils return java.awt.Window, mais si vous avez ajouté votre panneau JFrame, vous pouvez le jeter à JFrame.

Les 2 moyens directs et les plus simples:

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

Pour être complet d'autres façons:

JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
JFrame f4 = (JFrame) SwingUtilities.getRoot(comp);
JFrame f5 = (JFrame) SwingUtilities.getRootPane(comp).getParent();
 31
Author: icza, 2014-08-05 19:55:22
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
 30
Author: Ismael Abreu, 2012-03-10 22:59:23

Comme d'autres commentateurs l'ont déjà mentionné, il n'est généralement pas valable de simplement lancer à JFrame. Cela fonctionne dans la plupart des cas particuliers, mais je pense que la seule réponse correcte est f3 par icza dans https://stackoverflow.com/a/25137298/1184842

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

Parce que c'est un cast valide et sûr et presque aussi simple que toutes les autres réponses.

 1
Author: jan, 2018-09-03 20:32:32