web-dev-qa-db-fra.com

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

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

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
}

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

68
scravy

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

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

Il existe 2 méthodes différentes et directes pour cela dans SwingUtilities qui fournissent les mêmes fonctionnalités (comme indiqué dans leur Javadoc). Ils sont de retour Java.awt.Window mais si vous avez ajouté votre panneau à un JFrame, vous pouvez le convertir en toute sécurité en JFrame.

Les 2 manières directes et les plus simples:

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

Pour être complet d'autres manières:

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

Comme d'autres commentateurs l'ont déjà mentionné, il n'est généralement pas valide de simplement transtyper en 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 casting valide et sûr et presque aussi simple que toutes les autres réponses.

1
jan