Swing y JFC (Java Foundation Classes)

Muchas clases Swing soportan di�logos -- ventanas que son m�s limitadas que los frames. Para crear un di�logo, simple y est�ndard se utiliza JOptionPane. Para crear di�logos personalizados, se utiliza directamente la clase JDialog. La clase ProgressMonitor puede poner un di�logo que muestra el progreso de una operaci�n. Otras dos clases, JColorChooser y JFileChooser, tambi�n suministran di�logos est�ndard. Para mostrar un di�logo de impresi�n se utiliza el m�todo getPrintJob de la clase Toolkit.

El c�digo para di�logos simples puede ser m�nimo. Por ejemplo, aqu� tenemos un di�logo informativo.

Aqu� podemos ver el c�digo que lo crea y lo muestra.

JOptionPane.showMessageDialog(frame, "Eggs aren't supposed to be green.");

El resto de esta p�gina cubre los siguientes t�picos.

.�Introducci�n a los di�logos

Todo di�logo depende de un frame. Cuando el frame se destruye, tambi�n se destruyen sus di�logos. Cuando el frame es minimizado, sus di�logos dependientes tambi�n desaparecen de la pantalla. Cuando el frame es maximizado, sus di�logos dependientes vuelven a la pantalla. El AWT proporciona autom�ticamente este comportamiento.

Un di�logo puede ser modal. Cuando un di�logo modal es visible, bloquea las entradas del usuario en todas las otras ventanas del programa. Todos los di�logos que proporciona JOptionPane son modales. Para crear un di�logo no modal, debemos utilizar directamente la clase JDialog.

La clase JDialog es una subclase de la clase java.awt.Dialog del AWT. Le a�ade a Dialog un root pane y soporte para una operaci�n de cerrado por defecto. Estas son las mismas caracter�sticas que tiene JFrame, y utilizar directamente JDialog es muy similar a hacerlo con JFrame. Puedes ver C�mo crear Frames para m�s informaci�n sobre c�mo a�adir componentes a una ventana y c�mo implementar alg�n oyente de window.

Incluso si utilizamos JOptionPane para implementar un di�logo, estamos utilizando JDialog detr�s de la escena. La raz�n para esto es que JOptionPane es simplemente un contenedor que puede crear autom�ticamente un JDialog y se a�ade a s� mismo al panel de contenido de JDialog.

.�Caracter�sticas de JOptionPane

Utilizando JOptionPane, se pueden crear muchos di�logos. Aqu� podemos ver unos ejemplos, todos producidos por DialogDemo.

Como podr�amos observar en los ejemplos anteriores, JOptionPane proporciona soporte para mostrar di�logos est�ndards, proporcionando iconos, espec�ficando el t�tulo y el texto del di�logo, y personalizando el texto del bot�n. Otras caracter�sticas permiten personalizar los componentes del di�logo a mostrar y especificar si el di�logo deber�a aparecer en la pantalla. Incluso se puede especificar qu� panel de opciones se pone a s� mismo dentro de un frame interno (JInternalFrame) en lugar de un JDialog.

Cuando se crea un JOptionPane, el c�digo espec�fico del aspecto y comportamiento a�ade componentes al JOptionPane y determina la distribuci�n de dichos componentes. La siguiente figura muestra c�mo los aspectos y comportamientos m�s comunes distribuyen un JOptionPane.

icono

(si existe)

mensaje
botones

Para la mayor�a de los di�logos modales sencillos, se crea y se muestra el di�logo utilizando uno de los m�todos showXxxDialog de JOptionsPane. Para ejemplos de utilizaci�n de los siguientes m�todos, puedes ver DialogDemo.java. Si nuestro di�logo deber�a ser un frame interno, se a�ade Internal despu�s de show -- por ejemplo, showInternalMessageDialog.

showMessageDialog
Muestra un di�logo modal con un bot�n, etiquetado "OK". Se puede especificar f�cilmente el mensaje, el icono y el t�tulo que mostrar� el di�logo.
showConfirmDialog
Muestra un di�logo modal con dos botones, etiquetados "Yes" y "No". Estas etiquetas no son siempre terriblemente descriptivas con las actiones espec�ficas del programa que causan.
showInputDialog
Muestra un di�logo modal que obtiene una cadena del usuario. Un di�logo de entrada muestra un campo de texto para que el usuario teclee en �l, o un ComboBox no editable, desde el que el usuario puede elegir una de entre varias cadenas.
showOptionDialog
Muestra un di�logo modal con los botones, los iconos, el mensaje y el t�tulo especificado, etc. Con este m�todo, podemos cambiar el texto que aparece en los botones de los di�logos est�ndard. Tambi�n podemos realizar cualquier tipo de personalizaci�n.

El soporte de iconos de JOptionPane permite especificar qu� icono mostrar� el di�logo. Podemos utilizar un icono personalizado, no utilizar ninguno, o utilizar uno de los cuatro iconos est�ndard de JOptionPane (question, information, warning, y error). Cada aspecto y comportamiento tiene sus propias versiones de los cuatro iconos est�ndard. La siguiente imagen muestra los iconos utilizados en el Aspecto y Comportamiento Java (popularmente conocido como Metal).

question information warning error

Por defecto, un di�logo creado con showMessageDialog muestra el icono de informaci�n, un di�logo creado con showConfirmDialog o showInputDialog muestra un icono question. Para especificar qu� un di�logo est�ndard no tenga icono o tenga otro icono est�ndard, se a�ade un par�metro que especifica el tipo de mensaje. El valor del tipo de mensaje puede ser una de las siguientes constantes: PLAIN_MESSAGE (sin icono), QUESTION_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, o ERROR_MESSAGE. Si especificamos un objeto Icon distinto de null, el di�logo muestra ese icono, no importa el tipo de mensaje que sea. Aqu� tenemos un ejemplo que crea un d�alogo sencillo que muestra un mensaje de error:

JOptionPane.showMessageDialog(frame,
                              "Eggs aren't supposed to be green.",
                              "Inane error",
                              JOptionPane.ERROR_MESSAGE);

Normalmente, el �rea del mensaje de un panel de opciones tiene una s�la l�nea de texto, como "Eggs aren't supposed to be green." Podemos dividir el mensaje en varias l�neas poniendo caracteres de nueva l�nea (\n) dentro del string del mensaje. Por ejemplo.

"Complete the sentence:\n"
+ "\"Green eggs and...\""

Podemos especificar el texto mostrado por los botones del panel. Un ejemplo de esto est� en Personalizar el texto de los botones en un di�logo est�ndard. Cuando el usuario pulsa cualquier bot�n, el di�logo desaparece autom�ticamente. si no queremos que el di�logo desaparezca autom�ticamente -- por ejemplo, si queremos asegurarnos de que la entrada del usuario es v�lida antes de cerrar el di�logo -- necesitamos seguir los pasos descritos en Detener la salida Autom�tica de un Di�logo.

Cuando se llama a uno de los m�todos showXxxDialog de jOptionPane, el primer argumento especifica un componente. Este componente determina la posici�n en la pantalla del d�alogo y del frame del que �ste depende. Si especificamos null para el componente, el di�logo es independiente de cualquier frame visible, y aparece en el medio de la pantalla. La siguiente figura muestra lo que sucede cuando se indica un JFrame como primer argumento.

.�El Ejemplo DialogDemo

Aqu� tenemos una imagen de una aplicaci�n que muestra di�logos.

Intenta esto:
  1. Compila y ejecuta la aplicaci�n, El fichero fuente es DialogDemo.java.
  2. Pulsa el bot�n "Show it!".

    Aparecer� un di�logo modal. Hasta que lo cierres, la aplicaci�n no responder�, aunque se redibujar� a s� misma si es necesario. Puedes salir del di�logo pulsando un bot�n o expl�citamente utilizando el icono de cerrado de la ventana.

  3. Minimiza la ventana DialogDemo mientras se muestra el di�logo.

    El di�logo desaparecer� de la pantalla hasta que maximices la ventana de DialogDemo.

  4. En el panel "More Dialogs", pulsa el bot�n de r�dio iferior y luego el bot�n "Show it!". Aparecer� un di�logo no modal. Observa que la ventana de DialogDemo permanece totalmente funcional mientras est� activo el di�logo no modal.

.�Personalizar el texto de los botones en un di�logo est�ndard

Cuando se utiliza JOptionPane para crear un di�logo est�ndard, podemos elegir si utilizar el texto est�ndard del bot�n (que podr�a variar dependiendo del aspecto y comportamiento) o especificar un texto diferente..

El siguiente c�digo, tomado de DialogDemo.java, crea dos di�logos Yes/No. El primer di�logo utiliza las palabras del aspecto y comportamiento para los dos botones. El segundo di�logo personaliza las palabras. Con la excepci�n del cambio de palabras, los di�logos son id�nticos. Para personalizar las palabras, el c�digo que crea el segundo di�logo utiliza showOptionDialog, en vez de showConfirmDialog.

./create the yes/no dialog:
int n = JOptionPane.showConfirmDialog(
	frame, "Would you like green eggs and ham?",
	"An Inane Question",
	JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION) {
    setLabel("Ewww!");
} else if (n == JOptionPane.NO_OPTION) {
    setLabel("Me neither!");
} else {
    setLabel("Come on -- tell me!");
}
./create the yes/no (but in other words) dialog:
String string1 = "Yes, please";
String string2 = "No way!";
Object[] options = {string1, string2};
int n = JOptionPane.showOptionDialog(frame,
		"Would you like green eggs and ham?",
		"A Silly Question",
		JOptionPane.YES_NO_OPTION,
		JOptionPane.QUESTION_MESSAGE,
		null,     //don't use a custom Icon
		options,  //the titles of buttons
		string1); //the title of the default button
if (n == JOptionPane.YES_OPTION) {
    setLabel("You're kidding!");
} else if (n == JOptionPane.NO_OPTION) {
    setLabel("I don't like them, either.");
} else {
    setLabel("Come on -- 'fess up!");
}

.�Obtener entrada del usuario desde un di�logo

C�mo se vi� en el ejemplo anterior, los m�todos showXxxDialog de JOptionPane devuelven un valor que indica la elecci�n del usuario. Si, por otro lado, estamos dise�ando un di�logo personalizado, necesitamos dise�ar el API de nuestro di�logo para que pueda preguntar al usuario sobre la elecci�n del usuario.

Para los di�logos est�ndard JOptionPane, los m�todos showXxxDialog devuelven un entero. Los valores por defecto para este entero son YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION, y CLOSED_OPTION. Excepto para CLOSED_OPTION, cada opci�n correponde con el bot�n pulsado por el usuario. Cuando se devuelve CLOSED_OPTION, indica que el usuario ha cerrado la ventana del di�logo expl�citamente, en vez de elegir un bot�n.

Incluso si cambiamos los textos de los botones del di�logo est�ndard (como en el ejemplo anterior), el valor devuelto sigue siendo uno de los enteros predefinidos. Por ejemplo, un di�logo YES_NO_OPTION siempre devuelve uno e los siguientes valores: YES_OPTION, NO_OPTION, o CLOSED_OPTION.

.�Detener la Despedida Autom�tica de un Di�logo

Por defecto, cuando el usuario crea un bot�n del JOptionPane o cierra su ventana expl�citamente, el di�logo desaparece. Pero �que pasa si queremos comprobar la respuesta del usuario antes de cerrar la ventana? En este caso, debemos implementar nuestro propio oyente de change para que cuando el usuario pulse un bot�n, el di�logo no desparezca autom�ticamente.

DialogDemo contiene dos di�logos que implementan un oyente de change. Uno de esos di�logos es un di�logo modal, implementado en CustomDialog.java, que utiliza JOptionPane para obtener los iconos est�ndard y para obtener asistencia en la distribuci�n. El otro di�logo, cuyo c�digo est� abajo, utiliza un JOptionPane est�ndard Yes/No. Aunque este di�logo es poco m�s que in�til, su c�digo es lo suficientemente sencillo como para poder utilizarlo como plantilla para di�logos m�s complejos.

Junto con la configuraci�n del oyente de change, el c�digo siguiente tambi�n llama al m�todo setDefaultCloseOperation de JDialog e implementa un oyente de window que maneja apropiadamente el intento de cierre de la ventana. Si no nos importa ser notificados cuando el usuario cierre la ventana expl�citamente, podemos ignorar el c�digo que no est� en negrita.


final JOptionPane optionPane = new JOptionPane(
		"The only way to close this dialog is by\n"
		+ "pressing one of the following buttons.\n"
		+ "Do you understand?",
		JOptionPane.QUESTION_MESSAGE,
		JOptionPane.YES_NO_OPTION);

final JDialog dialog = new JDialog(frame, 
			     "Click a button",
			     true);
dialog.setContentPane(optionPane);
dialog.setDefaultCloseOperation(
    JDialog.DO_NOTHING_ON_CLOSE);
dialog.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent we) {
	setLabel("Thwarted user attempt to close window.");
    }
});
optionPane.addPropertyChangeListener(
    new PropertyChangeListener() {
	public void propertyChange(PropertyChangeEvent e) {
	    String prop = e.getPropertyName();

	    if (dialog.isVisible() 
	     && (e.getSource() == optionPane)
	     && (prop.equals(JOptionPane.VALUE_PROPERTY) ||
		 prop.equals(JOptionPane.INPUT_VALUE_PROPERTY))) {
		//If you were going to check something
		//before closing the window, you'd do
		//it here.
		dialog.setVisible(false);
	    }
	}
    });
dialog.pack();
dialog.show();

int value = ((Integer)optionPane.getValue()).intValue();
if (value == JOptionPane.YES_OPTION) {
    setLabel("Good.");
} else if (value == JOptionPane.NO_OPTION) {
    setLabel("Try using the window decorations "
	     + "to close the non-auto-closing dialog. "
	     + "You can't!");
}

.�El API Dialog

Las siguiente tablas listan los m�todos y constructores m�s utilizados de JOptionPane y JDialog. Otros m�todos que podr�amos utilizar est�n definidos por las clases JComponent y Component.

.�Mostrar di�logos modales est�ndard (utiizando m�todos de la clase JOptionPane)

M�todo Prop�sito
int showMessageDialog(Component, Object)

int showMessageDialog(Component, Object, String, int)

int showMessageDialog(Component, Object, String, int, Icon)

Muestra un di�logo modal con un bot�n.
int showOptionDialog(Component, Object, String, int, int, Icon, Object[], Object) Muestra un di�logo.
int showConfirmDialog(Component, Object)

int showConfirmDialog(Component, Object, String, int)

int showConfirmDialog(Component, Object, String, int, int)

int showConfirmDialog(Component, Object, String, int, int, Icon)

Muestra un di�logo modal que [PENDIENTE: elaborar].
String showInputDialog(Object)

String showInputDialog(Component, Object)

String showInputDialog(Component, Object, String, int)

String showInputDialog(Component, Object, String, int, Icon, Object[], Object)

Muestra un di�logo de entrada.
int showInternalMessageDialog(...)

int showInternalOptionDialog(...)

int showInternalConfirmDialog(...)

String showInternalInputDialog(...)

Implementa un di�logo est�ndard como un frame interno.

.�M�todos para utilizar JOptionPane directamente

M�todo Prop�sito
JOptionPane()

JOptionPane(Object)

JOptionPane(Object, int)

JOptionPane(Object, int, int)

JOptionPane(Object, int, int, Icon)

JOptionPane(Object, int, int, Icon, Object[])

JOptionPane(Object, int, int, Icon, Object[], Object)

Crea un ejemplar de JOptionPane.
Frame getFrameForComponent(Component)

JDesktopPane getDesktopPaneForComponent(Component)

Manejan m�todos de clase de JOptionPane que encuentran el frame o desktop pane, respectivamente, en el que se encuentra el componente especificado.

.�Otros Constructores y M�todos de JOptionPane

M�todos Prop�sito
JOptionPane()

JOptionPane(Object)

JOptionPane(Object, int)

JOptionPane(Object, int, int)

JOptionPane(Object, int, int, Icon)

JOptionPane(Object, int, int, Icon, Object[])

JOptionPane(Object, int, int, Icon, Object[], Object)

Crea un ejemplar de JOptionPane.

.�Constructores y M�todos m�s utilizados de JDialog

M�todo Prop�sito
JDialog()

JDialog(Frame)

JDialog(Frame, boolean)

JDialog(Frame, String)

JDialog(Frame, String, boolean)

Crea un ejemplar de JDialog. El argumento Frame, si existe, es el frame (normalmente un objeto JFrame) del que depende el di�logo. Se hace el argumento booleano true para especificar un di�logo modal, false o ausente, para especificar un di�logo no modal. Tambi�n se puede especificar el t�tulo de un di�logo utilizando un argumento string.
Container getContentPane()

setContentPane(Container)

Obtiene y selecciona el panel de contenido que normalmente es el contenedor de todos los componentes del di�logo.
int getDefaultCloseOperation()

setDefaultCloseOperation(int)

Obtiene y selecciona lo que sucece cuando el usuario intenta cerrar el di�logo. Valores posibles: DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE (por defecto).
void setLocationRelativeTo(Component) Centra el di�logo sobre el componente especificado.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR