2012-03-10 23 views
57

¿Cómo puedo obtener el JFrame en el que vive JPanel?Java/Swing: Obtenga Window/JFrame desde dentro de un JPanel

Mi solución actual es preguntar el panel por su padre (y así sucesivamente) hasta que encuentre una ventana:

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

¿Hay una manera más elegante, un método en la librería estándar puede ser?

Respuesta

111

Puede usar el método SwingUtilities.getWindowAncestor(...) que le devolverá una ventana que podría convertir a su tipo de nivel superior.

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

Esto fue realmente útil al usar los controladores Spring para conectar los eventos a Swing. –

+0

Fresco, fácil y funciona bien. –

29
JFrame frame = (JFrame)SwingUtilities.getRoot(x); 
+0

Esa es otra forma de hacer esto y también funcionará. 1+ voto. –

+4

Javadoc establece que esto podría ser un 'Applet' (no' Window' o 'Frame'). – icza

24

Hay 2, diferentes métodos directos para esto en SwingUtilities que proporcionan la misma funcionalidad (como se señaló en su Javadoc). Devuelven java.awt.Window, pero si agregó su panel a JFrame, puede convertirlo de manera segura en JFrame.

Las 2 formas directas y más simples:

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

Para completar algunas otras maneras:

JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp); 
JFrame f4 = (JFrame) SwingUtilities.getRoot(comp); 
JFrame f5 = (JFrame) SwingUtilities.getRootPane(comp).getParent(); 
+0

Esta es la respuesta más completa y útil. – lifeisfoo

1

Como otros comentaristas ya se ha mencionado, no es válido en general simplemente echar a JFrame. Que funciona en la mayoría de casos especiales, pero creo que la única respuesta correcta es f3 por icza en https://stackoverflow.com/a/25137298/1184842

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

porque se trata de un elenco válida y segura y casi tan simple como todas las demás respuestas.