Java / Swing: Obtener Window / JFrame desde el interior de un JPanel


¿Cómo puedo obtener el JFrame en el que vive un JPanel?

Mi solución actual es preguntar al 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 forma más elegante, un método en la Biblioteca Estándar puede ser?

Author: mKorbel, 2012-03-11

4 answers

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

JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
 118
Author: Hovercraft Full Of Eels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-10 22:55:42

Hay 2 métodos directos y diferentes para esto en SwingUtilities que proporcionan la misma funcionalidad (como se indica en su Javadoc). Regresan java.awt.Window pero si agregaste tu panel a un JFrame, puedes lanzarlo con seguridad a 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 formas:

JFrame f3 = (JFrame) SwingUtilities.getAncestorOfClass(JFrame.class, comp);
JFrame f4 = (JFrame) SwingUtilities.getRoot(comp);
JFrame f5 = (JFrame) SwingUtilities.getRootPane(comp).getParent();
 31
Author: icza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-05 19:55:22
JFrame frame = (JFrame)SwingUtilities.getRoot(x);
 30
Author: Ismael Abreu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-10 22:59:23

Como otros comentaristas ya han mencionado, no es generalmente válido simplemente lanzar a JFrame. Eso funciona en la mayoría de los 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 este es un molde válido y seguro y casi tan simple como todas las otras respuestas.

 1
Author: jan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 20:32:32