Programación en castellano
Inicio > Tutoriales > Lenguajes orientados a objeto > 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


Añadir Funcionalidad

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

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad
Mantenida por: Claudio y Dani.

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: jugar gratis | amor | navidad 2009 | registro de dominios | servidores dedicados
más internet: comprar | gratis | posicionamiento en buscadores | decoración libre | gifs animados