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

�Qu� m�todo define los detalles de la funcionalidad de la pulsaci�n de Return o del bot�n Enter?

Como estamos implementando el interface ActionListener, nos hemos comprometido a proporcionar los detalles para el m�todo actionPerformed. Cuando el usuario dispara un evento desde un campo de texto o un bot�n, se llama autom�ticamente al m�todo actionPerformed. Es dentro de este m�todo donde escribimos los detalles para lo que queramos que suceda cuando el usuario pulsa Return o pulsa sobre el bot�n Enter.

.�A�adir Funcionalidad

Ya se han construido los componentes GUI para este panel, y ahora estamos listos para forzar la acci�n cuando se introducen o solicitan los datos.

Hemos registrado los campos de texto y los botones como oyentes de eventos usando el m�todo addActionListener, y hemos implementado el interface ActionListener, haciendo de la clase Diver un objeto ActionListener y nos hemos comprometido a proporcionar el m�todo actionPerformed en this (esta) clase, la clase Diver. Ahora trabajaremos en los detalles de este m�todo. M�s adelante, escribiremos los detales para la funcionalidad de los check boxes en la clase CheckBoxHandler que hemos asignado a handler.

.�Definir el M�todo actionPerformed

Cuando implementamos un m�todo de un interface, debemos usar la firma id�ntica. En otras palabras, si el m�todo del interface es public, void, y acepta un String como par�metro, tambi�n deber�a hacerlo nuestra implementaci�n de ese m�todo.

Aqu� tenemos la firma del m�todo que debemos implementar:

public void actionPerformed(ActionEvent e)

Para implementar el m�todo actionPerformed, debemos darle acceso public, no debe devolver ning�n valor, y por lo tanto es void, y debe aceptar un objeto ActionEvent como par�metro. El e es s�lo el nombre de variable para el objeto ActionEvent, por eso podemos cambiarlo si queremos.

Sigue estos pasos...
  1. Abre el fichero Diver.java en tu editor de texto.
  2. A�ade la siguiente firma de m�todo justo despu�s del corchete de cierre del m�todo buildTrainingPanel:
    public void actionPerformed(ActionEvent evt)
      { // Opens method
      ...
      } // Closes method
    
  3. Graba el fichero.

Donde aparecen los ..., definimos el c�digo para la funcionalidad de este panel.

.�Sentencias de Control y Flujo del Programa

Al igual que el GUI, la funcionalidad de una aplicaci�n necesita un plan:

  • Decidir qu� queremos que haga la aplicaci�n.
  • Decidir qu� componentes est�n directamente implicados en esas acciones.
  • Dibujar en pseudo-c�digo como se llevar�n a cabo esas acciones.

El panel Diver Data hace lo siguiente:

  • Acepta entrada de usuario con campos de texto.
  • Acepta entrada de usuario con check boxes.
  • Si se pulsa Return o el bot�n Enter, muestra las entradas de usuario y oculta las cajas de entrada.
  • Si se pulsa Edit, muesta de nuevo las cajas de entrada

Hemos completado los dos primeros �tems y ya hemos escrito el pseudo-c�dgo de los dos �ltimos �tems. Primero dividamos estos dos �tems en pasos:

  • Si se pulsa Return o el bot�n Enter:
    • Muestra la entrada del usuario
    • Oculta las cajas de entrada
  • Si se pulsa Edit:
    • Muestra de nuevos las cajas de entrada.

Cuando escribimos c�digo, el programa se ejecuta l�nea a l�nea, a menos que le digamos otra cosa. Algunas veces necesitamos ejecutar un bloque de c�digo mientras existan ciertas condiciones, otras veces queremos que existan ciertas condificiones antes de que se ejecute el siguiente bloque de c�digo. A este proceso nos referimos como control de flujo del programa.

En el caso del panel Diver Data, los campos de texto se muestra s�lo si se ha pulsado Return o si ha pulsado sobre el bot�n Enter. Si ninguno de estos sucede, entonces la aplicaci�n no hace nada. Por otro lado, si se pulsa el bot�n Edit, hace que ciertos campos de texto sean visibles y est�n listos para aceptar entrada de usuario.

Abajo est� el mismo p�rrafo que acabas de ller, pero observa las palabras en rojo. Nos ofrecen pistas sobre los tipos de sentencias de control que deber�amos usar en nuestro c�digo:

En el caso del panel Diver Data, los campos de texto se muestra s�lo si (if) se ha pulsado Return o (or) si (if) se ha pulsado sobre el bot�n Enter. Si ninguno de estos sucede, entonces la aplicaci�n no hace nada. Por otro lado, si (if) se pulsa el bot�n Edit, hace que ciertos campos de texto sean visibles y listos para aceptar entrada de usuario.

.�Usar Sentencias if

Una sentencia if es una sentencia condicional para controlar el flujo de ejecuci�n que s�lo es conocido en el momento de la ejecuci�n. En una sentencia if, se eval�a una condici�n o expresi�n. Si la condici�n es true, entonces las sentencias del bloque se ejecutan. Si la sentencia es false, podemos proporcionar otras sentencias para que se ejecuten, o no sucede nada. La expresi�n a comprobar debe estar encerrada entre par�ntesis ().

Esta esla forma general de la sentencia if:

if(condition)
   statement;
else
   statement;

Podemos usar varias sentencias if, y podemos usarlas de foma anidada. Si aparece m�s de una sentencia despu�s de if o else, debemos usar corchetes. La palabra clave else es opcional:

if(condition)
 {
  statement1;
  statement2;
  statement3;
  }
 else
  {
   statement;
  }

.�Operadores L�gicos Booleanos

Otra palabra importante que debemos observa en ese p�rrafo es la palabra or. En el panel Diver Data, necesitamos comprobar dos posibles condiciones que devuelven true:

  • Si se ha pulsado Return
    O
  • Si se ha pulsado el bot�n Enter.

En el lenguaje Java, los operadores l�gicos operan sobre valores booleanos. Por ejemplo:

||  OR
&&  AND
!=  Not equal to

Hay m�s, pero por ahora s�lo necesitamos los listados arriba. Recordamos el pseudo-codigo y a�adimos alg�n c�digo real:

if (data is entered) || (Enter button is clicked)
   {
    display the text to the screen
    hide the text fields
   }
if (Edit is clicked)
   {
   Make the text fields visible
   }

Ahora que sabemos lo b�sico sobre nuestro control de flujo. Luego, necesitamos entener qu� deber�a ir como condiciones. Obviamente el pseudo-c�digo datos introducidos no va a funcionar. Lo que realmente estamos comprobando es si los campos de texto contienen texto introducido por el usuario. Apuntamos todos los campos de texto con un oyente de eventos. Cuando el usuario introduce el texto, se dispara un evento mediante la pulsaci�n de Return. Debemos decirle a nuestra aplicaci�n que get(obtenga) los datos y que set (seleccione) los datos a mostrar.

Todas las subclases de eventos, en este caso ActionEvent, heredan getSource de la clase EventObject. Este m�todo devuelve el objeto que dispara el evento.

En otras palabras, si el texto se ha introducido en un objeto de campo de texto llamado company, entonces se devuelve company. Ahora que sabemos qu� campo de texto ha disparado un evento, recuperamos el texto introducido. Para recuperar y mostrar los datos, usamos dos m�todos de la clase JTextComponent:

  • El m�todo getText recupera los datos.
  • El m�todo setText selecciona el texto.

Recuerda que, como los m�todos son heredados, no necesitamos un ejemplar de la clase JTextComponent para acceder a estos m�todos.

Luego asignamos el texto a un objeto JLabel para mostrarlo.

Como ejemplo:

// The evt variable is from the ActionListener
// object that was passed in the
// actionPerformed method.
if (evt.getSource() == company)
// Create a variable to hold the text
// you retrieve.
String companyText = name.getText();
// Assign the text to a label to
// display the text.
JLabel companyLabel = new JLabel("");
companyLabel.setText("Company:    "
+ companyText);
// Hides the text field of the company 
// text field object.
company.setVisible(false);

Este c�digo funciona si el usuario puls� la tecla Return, pero �qu� pasa con el bot�n Enter? En el c�digo de arriba, no se hab�a tenido en cuenta este escenario, pero es facil a�adirlo con el operador || en la primera l�nea:

if ((evt.getSource() == company) || 
  (evt.getSource() == enter))
...

El c�digo est� diciendo: "Si se pulsa Return en el campo de texto company o se devuelve el objeto enter, entonces haz lo siguiente." Observa los par�ntesis () extras. Cada condici�n est� encerrada en su propio juego de par�ntesis, y luego el grupo est� encerrado en otro juego de par�ntesis. Ten cuidado de no dejar fuera uno de los par�ntesis.

El panel Diver Data no tiene un bot�n Edit, que selecciona los campos de texto como visibles. Este trozo de c�digo puede ir dentro de una sentencia if el s�lo. Para hacer que los campos de texto sean visibles de nuevo, llamamos al m�todo setVisible y lo seleccionamos a true.

Sigue estos pasos...
  1. Abre el fichero Diver.java en tu editor de texto.
  2. Dentro del m�todo actionPerformed, escribe las sentencias if para recuperar los nombres de los objetos TextField usando el m�todo getSource.
  3. Llama al m�todo getText sobre todos los objetos TextField para recuperar el texto.
  4. Asigna el texto a un objeto JLabel para mostrarlo en la pantalla.
  5. Llama al m�todo setVisible sobre todos los objetos TextField y seleccionalos a false para ocultar los campos de texto.

    Aqu� hay un ejemplo:

    if ((evt.getSource() == name) || 
         (evt.getSource() == enter))
         {// Opens if statement
    		// Retrieves the text from the name 
    		// text field and assigns it to the 
    		// variable nameText of type String.
    		String nameText = name.getText();
    		lname.setText("Name:    " + nameText);
    		//After printing text to JLabel, hides 
    		// the text field:
    		name.setVisible(false);
    }// ends if statement
    
  6. Proporciona las sentencias de control para el bot�n Edit. Recuerda que si se pulsa el bot�n Edit, los campos de texto se vuelven visibles de nuevo:

    Aqu� hay un ejemplo:

    if (evt.getSource() == edit)
         { // Opens if statement
      
       // If edit button has been pressed
       // the following is set to visible
        name.setVisible(true);
        }// Closes if statement
    
  7. Graba el fichero.

Tu m�todo actionPerformed se deber�a parecer a este ejemplo

Esto completa la funcionalidad para los campos de texto y los botones, pero no define la funcionalidad de los check boxes. Podemos gobernar los check boxes haciendo que la clase Diver implemente el interface ItemListener, y definiendo el m�todo itemStateChanged en esta clase como hicimos para los campos de texto y los botones. Sin embargo, hay una forma mejor.

El beneficio de usar la programaci�n orientada a objetos es que nos permite construir software y hacer cambios sin cambiar otras partes del c�digo. Podemos cambiar un objeto sin causar problemas a los otros objetos porque los objetos interact�an a trav�s de m�todos.

El panel Diver Data define objetos GUI y mantiene la funcionalidad de esos objetos en m�todos. Esta es una buena programaci�n orientada a objetos, pero podemos mejorar este modelo confinando la funcionalidad en una clase interna.

�Las Clases Internas tienen acceso directo a las variables de ejemplar y a los m�todos que encierra la clase?
 A  SI
 B  NO

COMPARTE ESTE ARTÍCULO

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