MagMax Blog

Aviso: En este blog puede encontrar código!

Java Swing: Cerrando Un Dialog.

| Comments

Trabajando con Swing me he dado cuenta de algunas cosas raras en esta API. Una de ellas es la falta de uniformidad en la gente que lo usa. Esto, a veces, es culpa de una mala información. Otras, de la propia API.

En este caso me gustaría ver un ejemplo de lo que digo: cómo cerrar un Dialog. Para mi desgracia, me llevó casi 1 hora encontrar la manera adecuada.

En concreto, estoy tratando de cerrar la ventana desde el típico botón “Cerrar”.

Paso 1: ocultarlo

Hasta ahora siempre había realizado la siguiente acción:

this.setVisible(False);
this.dispose();

Esta manera está esencialmente bien, pero… Hay un problema. Es posible que el botón que estamos creando se comporte de forma distinta a la X de la ventana, ya que:

  • Hay una propiedad que indica qué debe ocurrir al pulsar esta X, llamada DefaultCloseOperation y cuyos valores pueden ser: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, DISPOSE_ON_CLOSE o EXIT_ON_CLOSE.
  • No se lanzarán los eventos asociados al cierre de la ventana.

Como se puede observar, de la forma en que yo cerraba la ventana siempre era un “DISPOSE_ON_CLOSE” y, encima, con efectos secundarios que pueden ser indeseables, como que los eventos no se lancen.

Forma correcta

Así que parece que cerrar la ventana a lo bestia no es el “camino Zen” más adecuado. Tras mucho buscar, encontré esto:

this.processWindowEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));

Lo que se hace así es solicitar que se ejecuten los eventos de cerrar la ventana, lo que desencadenará los eventos que deba desencadenar, y provocará que se ejecute la acción por defecto en la ventana, de manera que se comporte igual que la “X” de la ventana.

Como, personalmente, lo veo horrible y poco intuitivo, suelo encapsularlo en la función “fireCloseWindow”, aunque no me termina de convencer el nombre. Dice mucho de lo que hace (lanzar un evento). ¿Sería mejor un simple “closeWindow”? Quizá.

Comentando un poco el código, para poder lanzar la función processWindowEvent necesitamos proporcionarle un WindowEvent que no tenemos… así que tenemos que creárnoslo, usando las constantes de esta misma clase. Conceptualmente precioso; en la práctica, feo.

Más información

Si conocéis otra manera más correcta de cerrar un Dialog en Java, estoy abierto a opciones.

Claro, que si queréis más información, sólo tenéis que consultar la API de Java, centrándoos en el método setDefaultCloseOperation o bien en el método processWindowEvent.

También podéis visitar la clase WindowEvent.

De todas maneras, quizá el mejor sitio para ver todo esto es en la página sobre el uso de los diálogos.

Comments