Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Tutoriales > Lenguajes orientados a objeto > Java > Nuevo en Java > New 2 Java: Construir una Aplicación: 3.- Recibir Entradas de Usuario
-Tutoriales

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


Clases Internas

¿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.

 
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network