Miembros de la Clase y del Ejemplar
¿Por qué no hemos creado un ejemplar de la clase Color usando la palabra clave new en el método setBackground como lo hicimos en el método setLayout?
Si un campo o un método es static, no necesitamos un ejemplar de la clase para acceder a él. En su lugar, sólo necesitamos nombrar la clase que contiene el campo o el método, seguido por el operador punto y el nombre del campo o método que queremos usar.
Miembros de la Clase y del Ejemplar
Cuando creamos las variables name y street, creamos variables de ejemplar. Esto significa que para usar estas variables, necesitamos crear un ejemplar de la clase Diver. Si creamos varios ejemplares de la clase Diver, cada ejemplar contendría su propia copia de las variables de datos name y street.
Algunas veces no queremos que cada ejemplar tenga su propia copia. Hay veces en las que podríamos necesitar que los objetos usaran variables de clase, o mejor una variable static por las siguientes razones:

- Para forzar a un objeto a compartir los datos en vez de tener su propia copia
Por ejemplo, un contador podría ser compartido por varios ejemplares de la clase. Cada vez que se inicializa un ejemplar de la clase, el contador se incrementa en uno, compartiendo ese dato con cada ejemplar de la clase. Si en su lugar usamos incorrectamente una variable de ejemplar, cada nuevo ejemplar de la clase podría resetar la variable contador a cero, contar la inicialización como uno, y siempre tendría el contador un uno incorrecto, en lugar de tener las inicializaciones que realmente hay.
- Para inicializar datos antes o cuando se crea un objeto.
Por ejemplo, podríamos querer que un objeto account chequee el balance de una cuenta antes de incializarse. O sólo podríamos querer obtener la hora actual antes de asignarla a un objeto.
- Para permitir acceso a los datos sin tener que ejemplarizar la clase.
Las clases Color y Math tienen campos y métodos que podemos usar sin tener que crear un ejemplar de dichas clases.
Hasta ahora el único método static que hemos creado ha sido el método main de la clase DiveLog. La razón para esto es porque debe ser llamado antes de que exista el objeto, porque es el punto de entrada de la aplicación.
Los métodos estáticos tienen unas pocas restricciones:
- Sólo pueden llamar a otros métodos static
- Sólo deben acceder a datos static
- No pueden referirse a this o super
En la Parte 4 de esta serie, aprenderemos cómo definir miembros estáticos. Por ahora, sólo saber cuando usar miembros estáticos, y reconocer cuando están disponibles leyendo la documentación del API.
Ahora que el panel está inicializado, el color de fondo seleccionado a blanco, y la clase FlowLayout inicializada como controlador de distribución, sólo necesitamos añadir el objeto imaje que inicializamos en el constructor a este panel.
| Sigue estos pasos... |
- Abre el fichero Diver.java en tu editor de texto.
- Añade el siguiente método justo fuera del corchete de cierre del constructor:
// This method creates a panel called images.
private void buildImagePanel()
{ // Opens method
// Initializes a new JPanel object.
images = new JPanel();
// Sets the color, layout, and adds the
// seahorse object.
images.setLayout(new FlowLayout() );
images.setBackground(Color.white);
images.add(seahorse);
} // Closes method
- Graba el fichero.
|
Construir el GridLayout
El siguiente método a definir construye el panel address. Como con el método anterior, creamos un ejemplar de la clase JPanel, luego posteriormente le añadimos los objetos TextField y Label. Como hay ocho objetos que añadir a este panel, BorderLayout no es apropiado. En su lugar, usaremos GridLayout.
El controlador de distribución se crea inicializando la clase GridLayout como un parámetro del método setLayout:
setLayout(new GridLayout)
El GridLayout nos permite añadir objetos dentro de una parrilla rectangular de filas y columnas. Nosotros definimos cuántas filas y columnas cuando inicializamos la clase GridLayout. Además podemos añadir espacios verticales y horizontales:
// Sets the grid to 3 rows and 2 columns
setLayout(new GridLayout(3,2));
// Sets the grid to 5 rows, 4 columns, and
// vertical and horizontal gaps of 5
setLayout(new GridLayout(5,4,5,5));
Puedes referirte al diagrama para decidir cuántas filas y columnas necesitamos, y experimentar con los valores de Vgap y Hgap para decidir cuánto, si algo, necesitamos separar nuestros objetos
Observa el grid layout para el panel address en el panel Diver Data:
Cuando añadimos los objetos al panel que usa el controlador grid layout, los objetos se añaden en el orden en que los codificamos. Los objetos se insertan de izquierda a derecha en la primera fila, luego de izquierda a derecha en la secunda fila, etc. No especificamos una región como hicimos en el controlador BorderLayout. A todos los componentes añadidos al GridLayout se les da el mismo tamaño. Para los objetos del panel address, esto no es un problema.
La clase GridLayout tiene métodos accesores set y get si necesitamos manejar dinámicanente la distribución. Por simplicación, codificamos el número de filas y columnas para este panel usando el constructor de GridLayout en el método setLayout.
| Sigue estos pasos... |
- Abre el fichero Diver.java en tu editor de texto.
- Empieza el método buildAddressPanel de esta forma:
private void buildAddressPanel ()
{ // Opens method
jaddress = new JPanel();
// Sets color and layout.
// Adds the text fields and labels for
// diver input.
jaddress.setBackground(Color.white);
jaddress.setLayout( new GridLayout(2, 4, 20, 20) );
//Adds each component to the panel
jaddress.add(lname);
jaddress.add(name);
jaddress.add(lstreet);
jaddress.add(street);
jaddress.add(lcity);
jaddress.add(city);
jaddress.add(lstatezip);
jaddress.add(statezip);
} // Closes method
- Graba el fichero.
|
Hasta ahora el método buildAddressPanel hace lo siguiente:
- Asigna un ejemplar de la clase JPanel a la variable que configuramos anteriormente con jaddress.
- Selecciona el color de fondo del objeto panel jaddress a blanco, usando el operador punto y el identificador de variable.
- Crea un ejemplar de la clase GridLayout con dos filas y cuatro columnas, y un valor de 20 para Vgap y Hgap para usarlo como controlador de distribución usando el método setLayout.
- Añade los objetos Label y TextField al panel en el orden en que deben aparecer.
Como el panel Diver Data consta de varios paneles que piden diferentes tipos de información, proporcionar texto para identificar este área particular mejora su uso. Podríamos simplemente usar un objeto label para etiquetar este área del panel, pero un borde agrupa los componentes más amigablemente.
Aquí tenemos un ejemplo de creación de un borde:
JPanel pane = new JPanel();
pane.setBorder(
BorderFactory.createLineBorder(Color.black));
Primero se nombra el objeto que va a tener el borde, luego se llama al método setBorder, heredado de JComponent. Le pasamos la clase BorderFactory como parámetro, y llamamos al método que queremos usar, usando el operador punto. Observa que no estámos creando un ejemplar de la clase BorderFactory. En su lugar, se llama a uno de sus métodos con el operador punto.
¿Cómo podemos obtener los métodos de BorderFactory sin crear un ejemplar de la clase? Como aprendimos anteriormente, a través de los métodos static. La clase BorderFactory tiene varios métodos estáticos disponibles para usarlos simplemente con el nombre de la clase y el operador punto, luego llamando al método para el borde que queremos crear.
Para crear un borde de línea coloreada, como demuesta el código de arriba, el createLineBorder necesita que le pasemos en la clase Color uno de sus campos estaticos para el color elegido.
En el panel Welcome creamos un borde con título. Hagámoslo de nuevo para el panel address de Diver Data:.
| Sigue estos pasos... |
- Abre el fichero Diver.java en tu editor de texto.
- Crea un borde con título en el método buildAddressPanel de esta forma:
jaddress.setBorder(BorderFactory.createTitledBorder(
"Diver Personal Information"));
- Graba el fichero.
|
Hasta ahora hemos creado el panel, seleccionado el color de fondo, seleccionado el controlador de distribución, añadido los componentes y dibujado un borde alrededor de ellos. Tenemos lo básico del GUI pero sin funcionalidad.
El software sin funcionalidad tiene un uso limitado. Este panel Diver Data está pensado para hacer algo más que mostrar información. Una vez que el usuario introduce la información solicitada y pulsa el botón Enter o pulsa Return, los datos se muestran en la pantalla. Hasta ahora sólo hemos configurado los componentes para aceptar datos, ahora debemos configurar los componentes para escuchar eventos, luego manejar esos eventos. El manejo de eventos hace el software GUI funcional.
Para añadir funcionalidad a los componentes, volvemos a la parte superior de la clase Diver.
| Sigue estos pasos... |
- Abre el fichero Diver.java en tu editor de texto.
- Cambia la declaración de la clase de:
public class Diver extends JPanel
a:
public class Diver extends JPanel
implements ActionListener
- Graba el fichero.
El código en negrita se ha añadido a la declaración de la clase. Podría haberse escrito en una sóla línea, pero la hemos dividido en dos por razones de la página Web.
|
| ¿Qué significa implements ActionListener? |
|
|