Java incorpora en el lenguaje dos bibliotecas gráficas: AWT y Swing. La primera es más básica y a veces compleja, pero su look es generalmente más liviano y rápido que Swing, aunque este último es mucho más agradable a la vista.
Para comenzar con los diseños de GUI, quiero comenzar con AWT y viendo algunas cosillas básicas para ir despertando el apetito de los lectores.
Primero, para ponernos de acuerdo, llamaremos widget a cualquier objeto gráfico. Esto incluye ventanas, botones, combobox y cualquier objeto que podamos poner en una GUI. Llamaremos contenedor (o container) a un widget que puede alojar dentro de si a otros widgets. Y, finalmente, llamaremos layout a la disposición de los objetos dentro de un contenedor.
Cuando se programan GUIs, el esquema de programación cambia: no importa si estás usando objetos, funciones o un conjunto de ifs y gotos: ahora tu preocupación es responder a las acciones que el usuario podría realizar en la GUI (como pinchar un botón, poner el mouse sobre un texto, etcétera). A estas acciones se les suele llamar eventos, los que deben ser manejados con una función/método.
La visión de Java en este sentido es que, al generarse un evento, se llama a los manejadores correspondientes, llamados listeners en Java. Esto significa que si quiero realizar una acción cuando se genere un evento en un widget, debo agregar el listener correspondiente al widget para que este realice una acción; para los más avanzados en Java -como ya imaginarán- los listeners son usualmente interfaces, y por razones obvias: de esa forma yo pongo cuerpo al método según lo que quiera realizar.
¿Aburrido de tanta lectura? Si… yo también estoy aburrido de escribir. Veamos un código pequeño, que al final todos aprendemos viendo código y haciendo desastres… xD
import java.awt.*;
public class Ventana {
private Frame ventanaPrincipal;
public Ventana() {
ventanaPrincipal = new Frame("Ejemplo AWT"); //Si... el título de la ventana
ventana.setSize(200, 130); //El tamaño... ancho y alto
ventana.setVisible(true); //Hace visible la ventana
//¿te imaginas como ocultar una ventana?
}
public static void main(String args[]) {
Ventana v = new Ventana();
}
}
Y con ese pequeño código conseguimos lo siguiente:

Pero, si te fijas bien, al hacer click en la X de la barra de la ventana, esta no se cierra. Si ejecutaste el código desde una consola, tendrás que ‘matar’ el programa con Ctrl+C. ¿Qué pasó? Simple: hay que manejar el evento ‘cerrar ventana’. Para ello, tendremos que implementar la interfaz WindowListener del paquete java.awt.event. Código de ejemplo en este preciso instante:
import java.awt.*;
import java.awt.event.*;
public class Ventana2{
private Frame principal;
public Ventana2() {
principal = new Frame("Ejemplo AWT");
principal.setSize(235, 130);
principal.addWindowListener(new EscuchaEventosVentana());
principal.setVisible(true);
}
class EscuchaEventosVentana implements WindowListener {
//Este evento es cuando se pulsa la X
public void windowClosing(WindowEvent e) {
System.out.println("Solicita cerrar la ventana");
Frame ventana = (Frame)e.getWindow();
ventana.setVisible(false);
ventana.dispose();
}
//Ocurre cuando ya se cerró la ventana
public void windowClosed(WindowEvent e) {
System.out.println("Ventana cerrada; terminar");
System.exit(0);
}
public void windowIconified(WindowEvent e) {
System.out.println("Iconified");
}
public void windowActivated(WindowEvent e) {
System.out.println("Activated");
}
public void windowDeactivated(WindowEvent e) {
System.out.println("Deactivated");
}
public void windowDeiconified(WindowEvent e) {
System.out.println("Deiconified");
}
public void windowOpened(WindowEvent e) {
System.out.println("Opened");
}
}
public static void main(String args[]) {
Ventana2 v = new Ventana2();
}
}
Si: WindowListener propone 7 métodos para implementar. Si sólo se interesa 1 de los 7, simplemente pon corchetes vacíos (cuerpo vacío) en el método que no te interesa implementar. En este caso, he implementado todos los métodos para que veas cuando se lanza cada evento.
Ok, no somos expertos en GUI, pero al menos podemos crear una ventana. ¿Te animas a probar ahora un botón?
Con el fin de ahorrar código, te explico de antemano: el listener asociado a un botón es el ActionListener. Así que ahora haremos cosas un poco más divertidas…
import java.awt.*;
import java.awt.event.*;
public class Ventana3{
private Frame principal;
private Button boton;
public Ventana3() {
principal = new Frame("Ejemplo AWT");
principal.setSize(235, 130);
principal.addWindowListener(new EscuchaEventosVentana());
boton = new Button("Salir");
boton.addActionListener(new EscuchaEventoBoton());
principal.add(boton); //agrega el botón a la ventana
principal.setVisible(true);
}
class EscuchaEventoBoton implements ActionListener {
public void actionPerformed(ActionEvent e) {
//Como se agregará al único botón disponible,
//no me molestaré en confirmar que sea el botón correcto
System.out.println("Boton salir presionado!");
principal.setVisible(false);
System.exit(0);
}
}
class EscuchaEventosVentana implements WindowListener {
//Este evento es cuando se pulsa la X
public void windowClosing(WindowEvent e) {
System.out.println("Solicita cerrar la ventana");
Frame ventana = (Frame)e.getWindow();
ventana.setVisible(false);
System.exit(0);
}
//Ocurre cuando ya se cerró la ventana
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
public static void main(String args[]) {
Ventana3 v = new Ventana3();
}
}
Bien… ya con esto tenemos al fin un botón. ¿Y si quisiera varios botones? ¿Bastaría con hacer varios add en la ventana y tendría varios botones? ¡Pues has la prueba! En un próximo artículo responderemos a esa pregunta.
AWT posee una tremenda cantidad de controles disponibles para utilizar. Mira la documentación del paquete java.awt y te darás cuenta de la cantidad. Sun pone también a disposición algunos tutoriales de cómo crear GUI, pero están en inglés y algunas cosas no se ven con tanta calma, por eso quiero hacer algunos artículos donde veamos GUI con más detalle… pero no puedo explicártelo todo: la idea es también investigar.
Si alguien lo desea, podría solicitar un artículo de un control en específico para revisarlo en detalle. O mejor aún: si tienes blog, podemos ponernos de acuerdo y hacer una serie de artículos donde tomemos controles y los expliquemos en detalle, un control por artículo. A quien le parezca la idea, que se apunte.
Y no se desesperen… Swing viene pronto
Fuente: http://esteparioprogramador.bligoo.com/content/view/258936/GUI_con_Java_I_A_W_T.html