3.2. Swing
3.2.1. Introducción a Swing
Anteriormente se ha visto una descripción de los controles AWT
para construir aplicaciones visuales. En cuanto a estructura, no hay mucha diferencia entre los controles proporcionados
por AWT y los proporcionados por Swing: éstos se llaman,
en general, igual que aquéllos, salvo que tienen una "J" delante;
así, por ejemplo, la clase Button de AWT pasa a llamarse
JButton
en Swing , y en general la estructura del paquete javax.swing
es la misma que la que tiene java.awt.
Pero yendo más allá de la estructura, existen importantes
diferencias entre los componentes Swing y los componentes AWT:
-
Los componentes Swing están escritos sin emplear código
nativo, con lo que ofrecen más versatilidad multiplataforma (podemos
dar a nuestra aplicación un aspecto que no dependa de la plataforma
en que la estemos ejecutando).
-
Los componentes Swing ofrecen más capacidades que los correspondientes
AWT:
los botones pueden mostrar imágenes, hay más facilidades
para modificar la apariencia de los componentes, etc.
-
Al mezclar componentes Swing y componentes AWT en una aplicación,
se debe tener cuidado de emplear contenedores AWT con elementos
Swing,
puesto que los contenedores pueden solapar a los elementos (se colocan
encima).
3.2.2. Características específicas de Swing
Resumen de controles
Los controles en Swing tienen en general el mismo nombre que los de AWT,
con una "J" delante. Así, el botón en Swing es JButton
, la etiqueta es JLabel , etc. Hay algunas diferencias, como por
ejemplo JComboBox (el equivalente a Choice de AWT), y controles
nuevos. Vemos aquí un listado de algunos controles:
JComponent |
La clase padre para los componentes Swing es JComponent , paralela
al Component de AWT. |
Botones
 |
Se tienen botones normales (JButton), de verificación
(JCheckBox), de radio (JRadioButton), etc, similares a los
Button,
Checkbox
de AWT, pero con más posibilidades (se pueden añadir imágenes,
etc). |
Etiquetas
 |
Las etiquetas son JLabel, paralelas a las Label de AWT
pero con más características propias (iconos, etc). |
Cuadros de texto
 |
Las clases JTextField y JTextArea representan los cuadros
de texto en Swing, de forma parecida a los TextField y TextArea
de AWT. |
Listas
 |
Las clases JComboBox y JList se emplean para lo mismo
que Choice y List en AWT. |
Diálogos y ventanas
 |
Las clases JDialog (y sus derivadas) y JFrame se emplean
para definir diálogos y ventanas. Se tienen algunos cuadros de diálogo
específicos, para elegir ficheros (JFileChooser ), para elegir
colores (JColorChooser), etc. |
Menús
 |
Con JMenu, JMenuBar, JMenuItem, se construyen
los menús que se construian en AWT con Menu, MenuBar
y MenuItem. |
Gestores de disposición y modelo de eventos
Los gestores de disposición de Swing son los
mismos que los vistos en AWT.
El modelo de eventos también es el
mismo que el visto en AWT.
Otras características
Swing ofrece otras posibilidades, que se comentan brevemente:
-
Uso de acciones, objetos Action que coordinan tareas realizadas
por distintos elementos.
-
Uso de bordes, elementos que bordean los controles y ofrecen un
mejor aspecto visual a la aplicación.
-
Uso de iconos: algunos componentes permiten que se les indique un
icono a mostrar, mediante la clase ImageIcon.
-
Uso de la apariencia (look and feel): podemos indicar qué
aspecto queremos que tenga la aplicación: específico de Windows,
de Motif, etc.
-
Uso de hilos para gestionar eventos: algunos eventos pueden bloquear
componentes durante mucho tiempo, y es mejor separar el tratamiento del
evento en un hilo para liberar el componente.
-
Uso de temporizadores: con la clase Timer podemos definir
acciones que queremos ejecutar en un momento determinado o con una periodicidad
determinada.
Ejemplo: Vemos el aspecto de algunos componentes de Swing, paralelo al
visto en el tema de AWT:
Código
Ejemplo: Vemos un ejemplo de uso de iconos y temporizadores (como icono se emplea
esta imagen): Código
3.2.3. Un ejemplo con Forte
Vamos a construir con Forte el ejemplo visto en el tema de AWT:
Figura 1. Ejemplo de aplicación
Para crear el formulario pinchamos en File - New - GUI Forms - JFrame
. Luego le damos un nombre (EjemploForte, por ejemplo), e ignoramos
el resto del proceso (luego pide elegir campos, métodos a sobreescribir,
etc).En la pestaña GUI Editing podemos modificar el formulario,
mediante la ventana Form Editor. En ella aparecen:
Figura 2. Editor de formularios en Forte
- Una paleta de componentes (Component Palette) en la parte superior
izquierda, con los controles que podemos colocar
- El formulario que estamos tratando (parte inferior izquierda).
- El inspector de componentes (Component Inspector) en la parte
superior derecha, donde se ve en forma de árbol los componentes que tiene
el formulario)
- La ventana de propiedades en la parte inferior derecha, con las
propiedades del control que se tenga actualmente seleccionado en el
formulario.
Seguimos los pasos:
-
Primero establecemos el layout del formulario a Absolute. Pinchando con el botón
derecho sobre el formulario en el Component Inspector podemos cambiarlo,
eligiendo el layout oportuno en Set Layout .
-
Después colocamos todos los controles. Necesitamos:
Para colocar los controles los elegimos, pinchamos donde queramos ponerlos.
Luego podemos moverlos o cambiarles el tamaño pinchando sobre ellos
y arrastrando. Nos queda un aspecto como:
Figura 3. Paso 1 de la construcción del ejemplo con Forte
-
Luego modificamos las propiedades de los controles, en el Component
Inspector, pinchando cada control y cambiando sus propiedades:
-
Para las etiquetas podemos cambiarle:
-
El nombre de la variable: pinchando con el botón derecho sobre ella,
elegir Rename.
-
El texto de la etiqueta: en la pestaña Properties, el campo text.
-
Luego podemos cambiar más cosas: bordes, iconos, etc. Pero de momento
lo dejamos así. Para cada etiqueta definimos, por ejemplo:
-
Para la del botón, nombre = lblBoton, texto = Incrementar
1.
-
Para la del combo, nombre = lblCombo, texto = Establecer contador.
-
Para la del cuadro de texto, nombre = lblTexto, texto = Valor
contador.
-
Para el botón también cambiamos nombre y texto, de la misma
forma que en las etiquetas. Le ponemos nombre = btnContador , texto
= Pulsame.
-
Para el combo ponemos nombre = comboContador. También tenemos
que definir los elementos que contiene. Para eso vamos a la pestaña
Code
Generation en las propiedades y en Post-Creation Code ponemos:
for (int i = 0; i < 10; i++)
comboContador.addItem("" + i);
-
Para el cuadro de texto ponemos nombre = txtContador , texto = 0
(para que empiece desde cero)
Tras esto, la ventana ya tendrá una apariencia como:
Figura 4. Paso 2 de la construcción del ejemplo con Forte
-
Finalmente, ya sólo queda definir los eventos:
-
En el botón, lo seleccionamos con el botón derecho, y vamos
a opción Events. Elegimos Action y actionPerformed
, e insertamos el código:
txtContador.setText("" +
(Integer.parseInt(txtContador.getText()) + 1));
-
En el combo, lo seleccionamos con el botón derecho, vamos a la opción
Events,
elegimos Item, e itemStateChanged . Insertamos el código:
txtContador.setText(
(String)(comboContador.getSelectedItem()));
Ya tenemos todo definido. Guardamos, compilamos el ejemplo (menú
Build
opción Compile), y lo ejecutamos (menú
Build
opción Execute).
3.3. Applets
Los ejemplos vistos hasta ahora son aplicaciones, puesto
que son instancias de la clase Frame o JFrame, y por tanto son ventanas que
pueden ejecutarse independientemente.
Un applet es una aplicación normalmente corta
(aunque no hay límite de tamaño), cuya principal funcionalidad
es ser accesible a un servidor Internet (una aplicación que pueda visualizarse
desde un navegador).
La forma de definir un applet es muy similar a la definición
de una aplicación, salvo por algunas diferencias:
- No se hereda de Frame, sino de Applet (clase java.applet.Applet
)
- No hay constructor, en su lugar hay un método init()
que veremos a continuación
- No hay método main(), puesto que el applet no puede autoejecutarse.
Lo que se ejecuta es la página HTML para ver el applet en el navegador.
El
appletviewer es un navegador mínimo distribuido con Java,
que espera como argumento un fichero HTML, que contendrá una marca
indicando el código que cargará el
appletviewer :
appletviewer <fichero HTML>
El código necesario para poder cargar un applet en una página
HTML es:
<HTML>
<BODY>
...
<APPLET CODE = nombre_prog.class WIDTH = 300 HEIGHT = 100>
</APPLET>
...
</BODY>
</HTML>
Donde se indican el fichero
.class compilado del applet, la anchura
y altura. Este código se coloca en un fichero HTML y puede verse desde
cualquier navegador que soporte Java, o con el programa
appletviewer
.
La clase Applet tiene unos métodos predefinidos
para controlar los applets:
- init ( ): este método se llama cada vez que el appletviewer
carga por primera vez la clase. En él deben inicializarse las características
del applet que se quieran (tamaño, imágenes, controles,
valores de variables, etc).
- start ( ): llamada para arrancar el applet cada vez que es visitado.
- stop ( ): llamada para detener la ejecución del applet.
Se llama cuando el applet desaparece de la pantalla.
- destroy ( ): se llama cuando ya no se va a usar más el
applet, y hay que liberar los recursos dispuestos por el mismo.
También se deben tener en cuenta los métodos:
- paint (Graphics g): llamada cada vez que el área de dibujo
del applet necesita ser refrescada. La clase Applet simplemente dibuja
un rectángulo gris en la pantalla, y es la derivada la que debe
sobrecargar la función para representar algo más. Se le
pasa como parámetro un objeto tipo Graphics que delimita la zona
a ser pintada.
Por ejemplo, si queremos dibujar una línea en el área
del applet, ponemos en su método paint:
public void paint (Graphics g)
{
g.drawLine(...);
}
Más adelante veremos con más detalle cómo dibujar con Java.
- update (Graphics g): en realidad, cuando el área de dibujo
del applet necesita refrescarse, se llama al método update
, cuya funcionalidad es llamar a paint(). Podemos hacer que haga
todo la función update, o limitarla a que sólo llame
a paint y que ésta haga todo.
- repaint( ): este método fuerza una llamada manual a update
3.3.1. Applets Swing
La única diferencia entre los applets construidos en AWT
y los construidos con Swing es que éstos heredan de la clase
JApplet
en lugar de la clase Applet. Pero se tiene el inconveniente de que
actualmente sólo la utilidad appletviewer está preparada
para ejecutar applets de Swing con Java 1.2 o posteriores. Para
el resto de navegadores deberemos contar con el Java Plug-in 1.1.1, que
contiene la versión 1.0.3 de Swing . El resto de la estructura
de los applets es la misma que para AWT.
Ejemplo: Vemos el ejemplo anterior convertido en applet. Puede verse aquí el código
y aquí la
página HTML con el applet.