Centro JDialog sobre el padre

Tengo una aplicación Java swing con un botón que produce una ventana emergente cuando se realiza una determinada acción. Me gustaría alinear el punto central de la ventana emergente con el punto central de la ventana principal cuando se representa. ¿Cómo puedo calcular las coordenadas x, y para conectar a setLocation() para la ventana emergente?

Solo para aclarar. No deseo el comportamiento de setLocationRelativeTo() porque establece el píxel superior izquierdo de la ventana emergente sobre el píxel central del cuadro principal. Quiero establecer el píxel central de la ventana emergente sobre el píxel central del cuadro principal.

setLocationRelativeTo … esto establece el píxel superior izquierdo de la ventana emergente sobre el píxel central del elemento principal. ..

¡No, no lo hace!

Diálogo Centrado

Cada uno de los 3 cuadros de diálogo mostrados por este sencillo ejemplo parece estar centrado, hasta donde puedo ver. Solo puedo adivinar que el código llama a setLocationRelativeTo en el momento equivocado.

 import javax.swing.*; class CenterTheDialog { CenterTheDialog() { for (int ii=1; ii<4; ii++) { JFrame f = new JFrame("Frame " + ii); f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); f.setSize(400,300); f.setLocationByPlatform(true); f.setVisible(true); JDialog d = new JDialog(f); d.setSize(300,200); d.setLocationRelativeTo(f); d.setVisible(true); } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { new CenterTheDialog(); }); } } 

En el JDialog que ha creado, debe llamar a pack() primero, luego setLocationRelativeTo(parentFrame) y luego a setVisible(true) . Con ese orden, el JDialog debería aparecer centrado en el cuadro principal.

Si no llama a pack() primero, establecer la ubicación relativa al principal no funciona correctamente porque el JDialog no sabe qué tamaño tiene en ese momento. Parece tomar el tamaño como 0 por 0, lo que da como resultado el “pixel superior izquierdo de la ventana emergente sobre el píxel central del posicionamiento principal” mencionado en un comentario a una de las otras respuestas.

Window#setLocationRelativeTo

Puede utilizar el evento e para obtener la ventana principal. Use getWindowAncestor y e.getSource() .

dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))

Podría tratar de pasar las coordenadas de la ventana primaria y su tamaño a la nueva ventana y agregar las coordenadas + 1/2 tamaño de fotogtwig principal en cada eje – 1/2 de las ventanas emergentes x / y para centrar en el centro.

O … Si extiende, podría usar setLocationRelativeTo (owner)

Espero que esto ayude