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?
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);
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();
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
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.