Interfaz Gráfica de Usuario Con Netbeans
Interfaz Gráfica de Usuario Con Netbeans
Interfaz Gráfica de Usuario Con Netbeans
GUI
El acrónimo GUI proviene de “Graphic User Interface” o Interfaz Gráfica de Usuario. Es la abreviatura que define la
interfaz gráfica de cualquier aplicación, y considero que es lo que le ha permitido a la computadora permitir que
cualquier usuario pueda utilizar fácilmente un programa.
Si pensamos un poco en el pasado de la computación, en épocas donde se tenía una interfaz sólo texto para
ejecutar comandos, podemos pensar lo importante que es ofrecerle al usuario una forma fácil e intuitiva de navegar
y realizar el trabajo en la aplicación que programamos.
En la figura 1 y 2 se pueden observar los elementos más populares de una Interfaz Gráfica de Usuario.
Considero que no debo adentrarme en explicar el funcionamiento de cada elemento, pues como se puede observar,
son objetos gráficos que usamos comúnmente en cualquier aplicación.
Como lo indica la documentación oficial, Swing proporciona un conjunto de componentes ligeros que trabajan de la
misma forma en todas las plataformas.
Los componentes Swing utilizan la infraestructura AWT, incluyendo el modelo de eventos AWT, el cual rige como un
componente reacciona a eventos tales como un clic, escribir en un componente, etc. Es por eso que la mayoría de
los programas Swing necesitan importar los paquetes java.awt.* y java.awt.event.*.
Como se indica en la figura, toda la acción de una aplicación GUI sucede al generarse un evento. Un evento es
cualquier cosa que un usuario le hace a un objeto gráfico, como por ejemplo, escribir en un cuadro de texto, hacer
clic sobre un elemento de menú o sobre un botón, entre otros.
Entonces lo “único” que debemos hacer es programar el método que se ejecutará cuando el evento suceda.
Contenedores
Cada aplicación Swing debe tener al menos un contenedor de alto nivel (Top-level Container), el cual podemos ver
como un tablero del cual se podrán colgar los objetos gráficos que queremos mostrar en la interfaz. Los
contenedores en Java son:
JFrame: Es la clase que representa una ventana típica con bordes, botones de cerrar, etc. y es la que típicamente
usaremos para crear nuestras aplicaciones, entre otras cosas, porque a su vez permite que se le cuelguen otros
contenedores, como JInternalFrame o JPanel.
JPanel: Esta clase es utilizada como un contenedor genérico para agrupar componentes, sin que generalmente sea
visible (Algo así como la herramienta agrupar en MS Word)
JApplet: Este contenedor permite agrupar componentes que serán mostrados en un navegador.
La primera aplicación GUI
Hola Mundo
Después de esta breve introducción, mostraré como desarrollar una aplicación GUI muy sencilla.
1. Ahora hacer click derecho sobre el paquete creado (o sobre Source Packages sino se creó un paquete) ir a New y
seleccionar JFrame Form… (ver Figura 4).
2. Continuar el proceso normal para crear un nuevo paquete (de preferencia, pero no obligatorio)
3. Iremos como de costumbre al menú File -> New Project, seleccionamos la categoría Java, presionamos el botón
Next y en la ventana New Java Application, escribimos el nombre del nuevo proyecto, pero nos aseguramos de NO
SELECCIONAR la casilla de Create Main Class. Clic en el botón Finish.
4. En el cuadro de diálogo que se abrirá, sólo se debe escribir el nombre de la clase que se creará. Para éste ejemplo
la he llamado VentanaPrincipal. Presionar Finish.
5. Ahora entramos al Editor gráfico de Netbeans. En la figura 5 se muestran las partes de este editor.
7. Cada vez que se selecciona un objeto gráfico, automáticamente el panel de Propiedades despliega los atributos
modificables en tiempo de edición del objeto. Por ello, seleccionando el objeto etiqueta, insertado en el JFrame,
modificaremos la propiedad text escribiendo el saludo que nos interesa desplegar.
8. La primera parte del programa está completada, por lo que no nos queda más que guardar y ejecutar el
programa, el cuál debería de mostrarse como se aprecia en la figura 6.
JSeparator
JLabel
JTextField
JButton
JLabel
En la figura 7 se aprecia su disposición en el JFrame.
Se puede conservar los nombres de los objetos que Netbeans les asigna o se pueden modificar. Yo recomiendo que
únicamente se modifiquen los nombres de los objetos interactivos o que programaremos. Por ejemplo, las etiquetas
de los mensajes “Hola Mundo Gráfico” y “Escribe tu nombre” son sólo informativas, por lo que no considero tan
importante que se modifiquen los nombres. En cambio, la última etiqueta se modificará en tiempo de ejecución y su
contenido cambiará conteniendo lo que el usuario escriba en la caja de texto.
Por ello a esta etiqueta le modificaremos el nombre usando el panel Navigator. Para cambiar el nombre de un
objeto gráfico:
1. Selecciona el objeto
2. Despliega el panel Navigator si es que no se está mostrando por default, haciendo click enWindow -
> Navigator o presionando las teclas Ctrl + 7.
3. En el panel Navigator, hacer click derecho sobre el objeto gráfico y luego seleccionar Change Variable
Name… tal y como se muestra en la figura 8. En la ventana que se abrirá, escribe el nombre del objeto
gráfico, recordando que se trata del nombre de un objeto, por lo que todas las reglas para construir
identificadores están vigentes y no se deben usar espacios en blanco o caracteres especiales.
Ahora crearemos el método que responderá al evento clic del botón Aceptar. Para ello, sólo es necesario hacer
doble clic sobre el botón. Esto abrirá el modo Source de Netbeans y nos encontramos con el ya clásico editor de
código, como se observa en la figura 9.
etiquetaNombre.setText(nombre);
etiquetaNombre.setVisible(true);
Una cosa más: haremos que la etiquetaNombre no se muestre al inicio del programa. Para ello, se modificará el
método constructor del JFrame:
public VentanaPrincipal() {
initComponents();
etiquetaNombre.setVisible(false);
Un vistazo al código.
Ahora revisaremos más a detalle el código que Netbeans generó. Como se puede apreciar:
public VentanaPrincipal() {
initComponents();
etiquetaNombre.setVisible(false);
}
El JFrame creado, VentanaPrincipal es una clase hija de JFrame. Sin embargo, a pesar de esto, podemos observar
una diferencia importante en el constructor: no inicia con el llamado al super constructor (super()). En el caso de los
objetos gráficos, el constructor inicia con una llamada al método initComponents(), el cual inicializa todos los
componentes swing de la interfaz creada usando el Constructor GUI de Netbeans.
Ahora el constructor es encargado, además de construir el objeto, inicializar los componentes que se mostrarán en
pantalla. Se recomienda no modificar directamente el código contenido en el método initComponents, pues se
encuentra vinculado de un modo muy complejo con el Editor GUI de Netbeans. La modificación de cualquiera de los
componentes gráficos (como nombre de objeto, apariencia, etc.) debe realizarse de cualquiera de estas dos formas:
Una vez más, el método main es el primer método que se ejecuta al correr la aplicación. En el caso de nuestro
programa, se crea lo que se conoce como la instancia de un hilo, a través de la creación de un objeto tipo Runnable.
Un hilo permite que una tarea pueda ser ejecutada al mismo tiempo con otra tarea, lo que en realidad es lo que
sucede cuando trabajamos en sistemas operativos multitareas: al abrir una aplicación se crea un hilo o thread que a
la vez que nos permite trabajar con esa aplicación, nos permite trabajar con otras (como tener MS Word abierto y el
Reproductor de música tocando).
Runnable es una interfaz a la que se le debe implementar el método run. Como se observa en el código, lo único que
el método run hará será crear una instancia de la VentanaPrincipal y mostrarla (poniendo su propiedad visible a
true). En adelante el control de la aplicación la tiene el usuario al generar un evento que dispare la ejecución del
método actionPerfomed del objeto.
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new VentanaPrincipal().setVisible(true);
}
});
}
Un control para cada entrada.
El control gráfico más básico, y también uno de los más útiles es el JTextField o caja de texto. Sin embargo, debemos
utilizar los controles más convenientes que nos permitan cerrar el conjunto de datos que el usuario pueda
proporcionar.
Por ejemplo, considera que dentro de la aplicación se requiere conocer la localidad donde vive un usuario. Si dejas
que el usuario introduzca esta información en una caja de texto, podría suceder lo siguiente:
1. Que el usuario escriba cualquier texto que no corresponda con el nombre de una localidad
2. Que el usuario escriba con faltas de ortografía el nombre de su localidad
3. Que el usuario no se equivoque y escriba correctamente el nombre de su localidad.
Ahora piensa que de la localidad ingresada, realizarás una búsqueda en una base de datos. Obviamente los
escenarios 1 y 2 arrojarán errores en la búsqueda, pues no se encontrarán esas “localidades” dentro de la base de
datos.
Por ello es mejor cerrarle al usuario las posibilidades de equivocarse. Con el uso de un JComboBox, por ejemplo,
podrías haberlo obligado a seleccionar una localidad de la lista, la cual contendrá los nombres correctos de las
localidades, lo que después para realizar una búsqueda en alguna base de datos evitaría los problemas.
Entonces, aunque genere un poco más de esfuerzo para el programador, lo ideal será diseñar nuestra GUI con los
controles gráficos más adecuados que ayuden a que el usuario se equivoque menos al introducir datos.
JCheckbox (Casillas de verificación) La clase JCheckbox proporciona los atributos y métodos para implementar una
casilla de verifiación que es básicamente un botón de dos estados. En la siguiente tabla se muestran los métodos
más comunes de esta clase.
boolean isSelected() Devuelve true si el componente está seleccionado, en caso contrario devuelve false
boolean isEnabled() Devuelve true si el componente está activo, en caso contrario, devuelve false
En este caso, el método que nos permite tener acceso al valor seleccionado es isSelected(), el cual es el que nos
regresa true si el objeto está seleccionado por el usuario o false si no lo está.
El comportamiento que caracteriza a este control y que es reconocido por los usuarios es la posibilidad de poder
seleccionar varios objetos de este tipo, sin que sean excluyentes, por lo que al diseñar la GUI de nuestra aplicación
debemos respetar las convenciones de uso ya establecidas universalmente y reconocidas por los usuarios.
La clase JRadioButton proporciona los atributos y métodos para implementar un botón de opción el cual es un
botón de dos estados mutuamente excluyentes. En la figura 2 se muestra un ejemplo de objetos de esta clase.
Mi recomendación es utilizar este tipo de botones para preguntas excluyentes, donde el usuario deba seleccionar
una y sólo una opción de n opciones. Alguos ejemplos de estas preguntas se muestran a continuación:
Para lograr este comportamiento, no basta con agregar el control JRadioButton, sino que además es necesario
agrupar los controles de este tipo en un ButtonGroup. La clase ButtonGroup se encuentra en la paleta de controles,
en la categoría Swing Controls, tal y como se muestra en la figura 3.
ButtonGroup no es un control visible, por lo que no se mostrará en el JFrame.De hecho, en el panel Navigator
tampoco se muestra como un control anclado al JFrame, sino que está categorizado como Otros Componentes
(Other Components). Esto se aprecia en la figura 4.
Una vez creado el ButtonGroup, lo único que falta es agregar los JRadioButon al grupo de botones. Para esto,
selecciona uno de los JRadioButton y usa la paleta Properties (Propiedades). Ahí se encuentra la propiedad
buttonGroup, y dado que ya fué creado el grupo, al presionar la flecha de la lista se desplegará el nombre del grupo.
Este proceso se observa en la figura 5.
Figura 5. Configurando la propiedad buttonGroup de un JRadioButton.
Si no se añaden los controles JRadioButton a un grupo, cada control será independiente, y tendremos el
comportamiento no deseado (ni esperado por el usuario) de poder seleccionar los n botones de opción que se
muestren en la interfaz.
Como verás, los métodos son los mismos que se presentan en un control JCheckBox.
Para la interfaz que se muestra en la Figura 4, el siguiente es el código asociado al botón Continuar, en el cual se
ejemplifica el uso de botones de opción: