Ejemplos java y C/linux

Tutoriales

Enlaces

Licencia

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Para reconocer la autoría debes poner el enlace http://www.chuidiang.org

Hola mundo con SWING

Vamos a hacer nuestra primera ventana con java. En este tutorial daremos un repaso a los conceptos más básicos para contruir ventanas que hagan algo. En nuestra primera ventana de ejemplo pondremos un botón y un campo de texto, de forma que al pulsar el botón, en el campo de texto saldrá "Hola mundo". Al final tienes el código completo del ejemplo.

CREAR LA VENTANA: EL JFrame

En Java tenemos principalmente dos tipos de ventana: JFrame y JDialog. No hay grandes diferencias entre ellas y podríamos usar indistintamente una u otra. Sin embargo, si queremos hacer las cosas como se debe, debemos tener en cuenta los siguientes puntos

Esto hace que el JFrame sea ideal para la ventana principal de nuestro programa y sólo debería haber un JFrame en toda la aplicación. Las demás ventanas de nuestro programa, que llamaremos ventanas secundarias, deberían ser JDialog y tener siempre como padre a JFrame

Por ello vamos a usar, para nuestro ejemplo, un JFrame. Al hacer new de JFrame podemos pasarle varias cosas. Optamos simplemente por pasarle el título para la ventana, que aparecerá en la barra de arriba de la misma

HolaMundoSwing.java
import javax.swing.JFrame;
...
JFrame v = new JFrame ("Ventana hola mundo");

EL LAYOUT

Tanto el JFrame como el JDialog tienen dentro una clase llamada Container. Esta clase es la encargada de "contener" los botones, campos de texto y demás zarandajas que queramos añadir.

Para añadir, por ejemplo, un botón, debemo pedir el Container a la ventana y añadirle el botón. Para obtener el Container se llama al método getContentPane() de la ventana. Luego, llamamos al método add() de ese Container para añadirle botones y demás. El código es como este

HolaMundoSwing.java
v.getContentPane().add(elBoton);

Ahora viene un tema muy importante y que da muchos quebraderos de cabeza. ¿Cómo coloca el Container los componentes que le vamos añadiendo? ¿Cómo puedo yo colocar un botón en un sitio concreto?.

El JFrame y el Container que lleva dentro tienen una clase llamada Layout. Esta clase es la encargada de decidir cómo se colocan los componentes. Existen muchos tipos de Layout según como queramos colocar los componentes. Unos los ponen alineados en fila (adecuados por ejemplo para una barra de herramientas o de botones), otros los ponen en forma de cuadrícula (por ejemplo, para los botones de una calculadora), etc, etc. Tienes un explicación algo más detallada y extensa, aunque no completa, de qué es exáctamente un Layout y cuáles hay.

Para nuestro ejemplo, usaremos un FlowLayout, que coloca los botones que le pasamos alineados, de izquierda a derecha. Como no es el Layout que lleva por defecto el JFrame, tenemos que ponérselo.

HolaMundoSwing.java
import java.awt.FlowLayout;
...
v.getContentPane().setLayout(new FlowLayout());

Siempre que queremos usar una clase de java que no sea propia del lenguaje, debemos poner el import antes de usarla, indicando el paquete en el que se encuentra. Esa es la línea import que he puesto delante.

Listo, ya tenemos todo preparado para crear los componentes y añadirlos.

AÑADIR LOS BOTONES

Vamos a añdir un botón y un campo de texto.

El primero es la clase JButton. Al hacer new de él admite como parámetro un texto, que será el que salga en el botón

HolaMundoSwing.java
import javax.swing.JButton;
...
JButton b = new JButton("Púlsame");

El segundo es la clase JTextField. Es un campo de texto de una sóla línea. Al hacer new de él, podemos poner el número de caracteres que queremos que sean visibles. Si no ponemos nada, el JTextField tiene de alto lo necesario para que quepan letras, pero no tiene ancho, por lo que quedará feo. Es mejor darle un número de caracteres para fijar su ancho.

HolaMundoSwing.java
import javax.swing.JTextField;
...
JTextField t= new JTextField(20);

Ahora sólo hay que añadir estos dos componentes a la ventana.

HolaMundoSwing.java
v.getContentPane().add(b);
v.getContentPane().add(t);

CONSEGUIR QUE EL BOTÓN HAGA ALGO

Ahora queremos que al pulsar el botón se ponga "Hola mundo" en el campo de texto.

Para darle funcionalidad a un botón, debemos llamar a su método addActionListener(). Este método necesita que le pasemos una clase que implemente la interface ActionListener. Esta interface únicamente tiene un método, actionPerformed().

Una primera aproximación de la clase que debemos pasarle al botón en su método addActionListener() podría ser esta:

HolaMundoSwing.java
public class FuncionalidadDelBoton implements ActionListener
{
   public void actionPerformed (ActionEvent e)
   {
      t.setText ("Hola mundo");
   }
}

Para que la clase implemente ActionListener hay que poner el implements ActionListener. Para que no tengamos problemas al compilar, esto nos oblga a definir todos los métodos de esa interface ActionListener. En este caso, sólo es el método actionPerformed().

Con esta clase, añadir la funcionalidad al botón puede ser algo así

HolaMundoSwing.java
b.addActionListener(new FuncionalidadDeBoton());

Esta es la idea, sin embargo, así tal cual no funciona. El motivo es que desde la clase FuncionalidadDeBoton no tenemos acceso al campo de texto t.

Java permite hacer estas clases que implementan interfaces de muchas formas distintas. Puedes ver todas las formas de implementar el ActionListener.

Nosotros vamos a ir por la más simple para nuestro caso, que consiste en una clase anónima, útil para casos sencillos como esta

HolaMundoSwing.java
b.addActionListener (new ActionListener ()
{
   public void actionPerformed (ActionEvent e)
   {
      t.setText ("Hola mundo");
   }
});

De esta manera estamos haciendo new directamente de la interface ActionListener. Como esta interface necesita que se implemente el método actionPerformed(), java nos permite hacerlo "sobre la marcha" en el mismo new. Esta clase anómima escrita dentro del código de la clase princpal tiene acceso a todos los atributos y métodos de la clase principal, por lo que sí podemos usar el campo de texto t.

Para meter texto en este campo de texto, usamos su método setText(), que reemplaza el texto que haya por el texto que metemos "Hola mundo".

VISUALIZAR LA VENTANA

Ahora sólo quedan los detalles de visualización de la ventana. Sólo tenemos que llamar a setVibible(true), pero conviene hacer alguna cosa más

Por defecto, cuando pulsamos la X de una ventana en su parte superior derecha, la ventana se oculta, pero no se termina el programa. En nuestro caso queremos que se oculte. Por ello, hacemos esta llamada

HolaMundoSwing.java
b.setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);

El método setDefaultCloseOperation() le indica a la ventana qué debe hacer cuando se cierre pulsando la X. El método admite alguna de las constantes definidas en WindowConstants. Hay más constantes, pero la que hace que termine el programa al cerrar la ventana es la indicada arriba

Otra cosa que conviene hacer es darle tamaño a la ventana. Para ello podríamos usar el método setSize(), con el que damos tamaño a la ventana tanto de ancho como de alto en pixels. Sin embargo, si hemos hecho bien las cosas, usando un layout correcto y dando tamaño a los componentes (como el 20 que pusimos como parámetro al crear el campo de texto), podemos simplemente hacer esta llamando al método pack().

HolaMundoSwing.java
b.pack();

El método pack() hace que la ventana coja el tamaño más pequeño posible que permita ver todos los componentes.

Finalmente, para hacer la ventana visible

HolaMundoSwing.java
b.setVisible(true);

EL CÓDIGO DE EJEMPLO

En HolaMundoSwing.java tienes el código completo de ejemplo. Fíjate que está dentro de un paquete, así que tendrás que poner la estructura de directorios adecuada para poder compilarlo y ejecutarlo.

Como ejercicio simple, ¿por qué no añades otro botón que borre el campo de texto?. Una tontería: para borrar el campo de texto no hay un método. Hay que llamar a setText() pasando una cadena vacía "".

Estadísticas y comentarios

Numero de visitas desde el 4 Feb 2007: