KeyboardFocusManager y Dialogos modales

De ChuWiki

Comentamos en JFrame y JDialog que la jerarquía de ventanas, cuales son padres de cuales, es importante, especialmente en ventanas modales.

Si una ventana tiene un botón que abre un JDialog -sea modal o no-, el padre del JDialog debería ser la ventana que contiene al botón. De esta forma, el JDialog no se iría detrás de la ventana con el botón.

Sin embargo, a veces queremos mostrar un JDialog modal pero no como consecuencia de la pulsación de un botón, sino por algún otro efecto. Por ejemplo, perdemos una conexión por socket y queremos avisar al usuario, estamos leyendo un fichero y sale un error o nos falla una consulta a la base de datos. Normalmente haremos este aviso usando JOptionPane.show...

En este caso, el padre del JDialog modal no está claro. Para asegurarnos y no tener problemas, deberíamos hacer que el padre de este JDialog modal sea la ventana que en ese momento está trabajando el usuario, la que tiene el foco, la ventana activa. Podemos obtener esa ventana fácilmente, con el siguiente código

Window ventanaActiva = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
if (ventanaActiva != null)
   JOptionPane.showMessageDialog(ventanaActiva, "Esto es un aviso");