�Las Clases Internas tienen acceso directo a las variables de ejemplar y a los m�todos que encierra la clase?
Una clase interna tiene el privilegio especial de acceso ilimitado a los miembros de su clase "madre", incluso si est�n declarados como private. Pero usando una clase interna para el manejo de eventos, encerramos el c�digo para el manejo de la entrada de usuario f�cilmente con un clase interna, mientras que usamos clases externas para los componentes GUI.
La siguiente secci�n nos muestra c�mo implementar esta funcionalidad usando clases internas
�Clases Internas
Las clases internas se definen dentro de una clase. En este caso, la clase encerrante es la clase Diver y la clase interna es la clase CheckBoxHandler. Hay cuatro tipos de clases internas:
- Clases internas simples.
- Clases internas con m�todos.
- Clases internas an�nimas.
- Clases internas est�ticas,
La clase Diver encierra una clase interna simple. Estas son las reglas b�sicas:
- Un ejemplar de una clase interna s�lo puede existir dentro de un ejemplar de la clase encerrante.
- Otras clases no pueden acceder a las clases internas sin crear un ejemplar de la clase encerrante.
- La clase interna tiene acceso directo a las variables de ejemplar y los m�todos de la clase encerrante sin tener que referenciar o manejar variables.
- Las clases internas pueden extender otras clases as� como implementar cuantos interfaces sean necesarios.
- Las clases internas pueden definirse como public, private, o protected.
En el caso de esta clase interna CheckBoxHandler le damos acceso private, ya que s�lo es usada en el contexto de la clase Diver.
Por ejemplo:
private class GUIEventHandler implements ActionListener
C�mo la clase CheckBoxHandler define la funcionalidad de los check boxes, debe implementar el interface ItemListener. Al gual que con el interface ActionListener, debemos implementar cualquier m�todo que declare ItemListener. De nuevo, s�lo hay un m�todo:
itemStateChanged(ItemEvent e)
Este m�todo es invocado cuando se selecciona o se desselecciona un �tem, y realiza las operaciones que necesitamos que ocurran cuando un �tem es seleccionado o deseleccionado. Cuando se selecciona un check box, aparece una marca en la caja. Cuando se deselecciona, la marca desaparece. Para a�adir esto, en el panel Diver Data el texto de los check boxes se vuelve azul cuando est�n seleccionados y negro cuando no lo est�n.
Antes de entrar en el pseudo-c�digo para planear la funcionalidad, declaramos la clase interna dentro de la clase Diver y proporcionamos la declaraci�n de m�todo prometida.
Sigue estos pasos... |
---|
|
�El Pseudo-C�digo
Listamos lo que deber�a suceder cuando los check boxes se seleccionan o deseleccionan:
Si se selecciona un check box:
- Determinamos qu� check box se ha seleccionado.
- Hacemos que el texto sea azul para ese check box.
O (else) si el check box es deseleccionado:
- Ponemos el texto en negro.
Podemos ver a primera vista que una sentencia if puede manejar esta funcionalidad, pero este pseudo-c�digo revela otra palabra clave else. Podemos usar varias sentencias if, pero usando else acortamos las l�neas de c�digo.
Encontramos qu� check box dispar� un evento usando el m�todo getSource que vimos anteriormente. La llamada a este m�todo devuelve los objetos seleccionados, luego proporcionamos las instrucciones para que se ponga el texto en azul. Hay un problema: necesitamos conocer si el check box est� seleccionado o deseleccionado.
La determinaci�n del estado (seleccionado o deseleccionado) se hace llamando al m�todo getStateChange y compar�ndolo con una constante de la clase ItemEvent que nos dice si el check box est� seleccionado. Estas constantes son static, por eso s�lo necesitamos usar el nombre de la clase y el operador punto:
e.getStateChange() == ItemEvent.SELECTED
Ahora podemos ajustar el pseudo-c�digo con m�s seguridad con alg�n c�digo real:
if (e.getSource() == ow) if (e.getStateChange() == ItemEvent.SELECTED) ow.setForeground(Color.blue); else ow.setForeground(Color.black);
Sigue estos pasos... |
---|
Tu clase deber�a ser igual que el fichero Diver.java. |
Ahora ya tenemos una clase interna que proporciona la funcionalidad de los componentes de entrada, mientras que la clase encerrante crea las caracter�sticas GUI que se presentan al usuario. Si necesitamos cambiar la funcionalidad, editamos la clase interna sin afectar a la clase principal. De igual forma, si modificamos la clase encerrante, la clase interna no se ver� afectada, a menos que a�adamos componentes que necesiten que se a�adan nuevas funcionalidades.
C�mo la clase interna s�lo funciona con una ejemplarizaci�n de la clase encerrante, est� protegida del acceso de otras clases. Usar clases internas tambi�n hace m�s f�cil la lectura del c�digo. Sabemos c�mo funciona la clase encerrante para las caracter�sticas GUI, o la clase interna para la funcionalidad.
En este punto, tenemos un programa que muestra etiquetas e im�genes, y proporciona campos de texto y check boxes para entradas de usuario. Cuando un usuario teclea datos en los campos de texto y pulsa Return o pulsa el bot�n Enter, los datos se muestran en la pantalla.
Queda una problema pendiente. Una vez cerrada la aplicaci�n, los datos se pierden. Para grabar los datos, necesitamos escribir la informaci�n en ficheros o en una base de datos. La Parte 4 nos ense�ar� I/O b�sica en Java lo que incluye la lectura y escritura de ficheros.
�Sumario
La Parte 3 del tutorial Dive Log revis� los conceptos de programaci�n de las Parte 1 y Parte 2 y present� algunos nuevos.
�Objetos de Entrada de Usuario
- Los campos de texto y los check boxes son componentes usados comunmente para recolectar datos del usuario.
- Pre-dibujar con l�piz y papel o un programa de dibujo para decidir c�mo queremos distribuir nuestros componentes de entrada de usuario. Y luego decidir qu� controlador de distribuci�n utilizar.
- Podemos a�adir muchos objetos a un panel incluyendo paneles que usen sus propias distribuciones.
�Encapsulaci�n y Control de Acceso
- La encapsulaci�n funciona a trav�s de implementaciones ocultas y modificadores de acceso.
- Se usan m�todos especiales para acceder a datos. Estos m�todos get (obtienen) o set (seleccionan) datos.
�Manejo de Eventos b�sico
- Los botones y pulsaciones del rat�n son ejemplos de events que son disparados por componentes.
- Para manejar eventos, una clase debe implementar el interface apropiado.
- Para registrar un componente como un oyente de eventos, llamamos al m�todo addxxxListener y le pasamos la clase de evento apropaida que implemente el m�todo que define la funcionalidad.
Las clases de la aplicaci�n Dive Log sirven como ejemplos introductorios al lenguaje Java. No es una gu�a compresible al lenguaje Java. pero es un ejemplo de una aplicaci�n que ense�a los conceptos b�sicos de la programaci�n en lenguaje Java. Los conceptos se presentan repetidos en diferentes partes del tutorial Dive Log, seg�n se vaya definiendo cada uno de los paneles de pesta�as.
La serie del tutorial Dive Log cubre m�s sobre los m�todos, objetos y costructores adem�s de crear otros componentes GUI y su funcionalidad. Cada clase Dive Log presenta nuevas ideas as� como repite las que se han presentado en anteriores partes del tutorial. Adem�s, cada clase que representa un panel de pesta�as se vuelve m�s compleja en t�rminos de caracter�sticas y conceptos de programaci�n.
Mira la Parte 4: Usar men�s desplegables, a�adir barras de desplazamiento a un �rea de texto, y leer y escribir desde ficheros.