New 2 Java: Construir una Aplicación: 3.- Recibir Entradas de Usuario

�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...
  1. Abre el fichero Diver.java en tu editor de texto.
  2. Despu�s del corchete de cierre del m�todo actionPerformed, declara una clase interna llamada CheckBoxHandler que implemente el interface ItemListener:
     
    private class CheckBoxHandler implements ItemListener 
     { // Opens inner class
    
  3. Declara un m�todo itemStateChanged, usando la firma correcta proporcionada en la documentaci�n del API Java:
    public void itemStateChanged (ItemEvent e)
    
  4. Graba el fichero.

.�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...
  1. Abre el fichero Diver.java en tu editor de texto.
  2. Implementa el m�todo itemStateChanged, proporcionando instrucciones para cada objeto check box: chequea para ver que el objeto es igual a cada una de tus variabes, y si est� seleccionado:
    if ( e.getSource() == ow )
         if ( e.getStateChange() == ItemEvent.SELECTED )
      ow.setForeground(Color.blue);
       else
         ow.setForeground(Color.black);
         
    if ( e.getSource() == a )
         if ( e.getStateChange() == ItemEvent.SELECTED )
     a.setForeground(Color.blue);
      else
        a.setForeground(Color.black);
       
    if ( e.getSource() == un )
        if ( e.getStateChange() == ItemEvent.SELECTED )
     un.setForeground(Color.blue)
      else
        un.setForeground(Color.black);
         
    if ( e.getSource() == res )
        if ( e.getStateChange() == ItemEvent.SELECTED )
     res.setForeground(Color.blue);
       else
        res.setForeground(Color.black);
         
    if ( e.getSource() == w )
         if ( e.getStateChange() == ItemEvent.SELECTED )
       w.setForeground(Color.blue);
        else
    w.setForeground(Color.black);
    
  3. Graba el fichero.

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP