java swing jframe swingutilities

Java/Swing: Obtenga Window/JFrame desde dentro de un JPanel



swingutilities (4)

Como ya han mencionado otros comentaristas, generalmente no es válido simplemente enviar contenido 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 elenco válido y seguro y casi tan simple como todas las otras respuestas.

¿Cómo puedo obtener el JFrame en el que vive 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 manera más elegante, un método en la Biblioteca estándar puede ser?


Hay dos métodos diferentes y directos para esto en SwingUtilities que proporcionan la misma funcionalidad (como se señala en su Javadoc). java.awt.Window pero si agregó su panel a un 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 otras formas:

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


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


JFrame frame = (JFrame)SwingUtilities.getRoot(x);