70 votes

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

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

Ma solution actuelle consiste à 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 une manière plus élégante, une méthode dans la bibliothèque standard peut être?

130voto

Hovercraft Full Of Eels Points 161146

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);
 

38voto

icza Points 3857

Il existe 2 méthodes directes différentes pour cela, en SwingUtilities qui fournissent les mêmes fonctionnalités (comme indiqué dans leur Javadoc). Ils renvoient java.awt.Window mais si vous ajoutez votre panneau à JFrame , vous pouvez le lancer en toute sécurité sur 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();
 

30voto

Ismael Abreu Points 9377
JFrame frame = (JFrame)SwingUtilities.getRoot(x);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X