New 2 Java: Construir una Aplicación: 5.- Escribir Objetos a Ficheros, Usar Arrays y más...

¿Qué metodos tenemos que implementar?

Cuando implementamos los intefaces ActionListener e ItemListener nos comprometimos a definir o implementar los dos siguientes métodos:

public void actionPerformed(ActionEvent ae)
public void itemStateChanged(ItemEvent ie)

El interface ActionListener requiere que implementemos el método actionPerformed(ActionEvent ae), y el interface ItemListener requiere que implementemos el método itemStateChanged(ItemEvent ie), incluso si los cuerpos de los métodos están vacíos.

En el caso de la clase UIWestPanel, les añadiremos alguna funcionalidad, como obtener un String indicando qué botón estaba seleccionado o qué ítem del menú se eligió.

. Definir Métodos para la Funcionalidad

Podríamos dejar estos métodos sin nada más que un cuerpo vacío, pero como queremos saber que ítem de menú seleccionó el usuario, definiremos las instrucciones para disparar esta información en los métodos actionPerformed y itemStateChanged:

. El Método actionPerformed

Como se mencionó anteriormente, el método getSelectedItem de la clase JComboBox devuelve el ítem seleccionado como un Object. En otras palabras, un objeto genérico. Nosotros necesitamos un objeto String, para que podamos compararlos posteriormente. Para convertir, o mejor, para forzar el Object devuelto a un String específico, debemos especificar el tipo encerrado entre paréntesis.

Por ejemplo, si el identificador del objeto JComboBox es fishspecies, y queremos saber si el usuario seleccionó Goldfish o Rockfish:

  1. Llamamos al método getSelectedItem con el operador punto y el identificador.
  2. Forzamos el Object a un objeto String.
  3. Lo asignamos a un variable del tipo String.

Aquí podemos verlo:

String fs = (String)fishspecies.getSelectedItem();

Una vez que tenemos los resultados asignados al identificador, podemos comparar los strings con:

if ((fs.equals("Goldfish"))
   System.out.println("Buy a fish bowl.");
   else
   System.out.println("Go scuba diving.");

Para el panel Log Dives, usamos JOptionPane para mostrar ciertos mensajes, dependiendo de la selección del usuario. Ya utilizamos esta técnica cuando aprendimos el manejo de errores, y requerimos información del usuario. En el panel Log Dives, también podemos utilizarlo para proporcionar comentarios como se muestra abajo:

La imagen de arriba muestra un mensaje de aviso cuando el usuario selecciona una profundidad de 120 pies.

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. Añade el siguiente método actionPerformed. Cambia el texto de la ventana desplegable según lo necesite tu aplicación:
    public void actionPerformed(ActionEvent ae)
      { //Opens method 
       s = (String) maxDepths.getSelectedItem();
             
         if ((s.equals("10")) || (s.equals("20")))
           JOptionPane.showMessageDialog(null,
                    "You should go snorkling!");
        else if ((s == "120") || (s == "140") ||  (s == "160"))
           JOptionPane.showMessageDialog(null,
                        "You'd better be an experienced diver!", 
                        "Warning", JOptionPane.WARNING_MESSAGE);
             else if ((s == "180") || (s == "200"))
                JOptionPane.showMessageDialog(null,
                   "You better have a thorough understanding" +
                             " of mixed gases and deco stops!", 
                            null, JOptionPane.WARNING_MESSAGE);
       }//Closes method
    
  3. Graba el fichero.

. El método itemStateChanged

Se llama a itemStateChanged cuando se selecciona uno de los botones de radio. Los mensajes desplegables son innecesarios ya que sólo hay dos botones de radio, lo que si necesitamos dentro de este método es un modo de determinar qué botón se seleccionó. Una forma de encontrarlo es utilizar el método getItemSelectable de la clase ItemEvent. Este método devuelve el objeto que generó el objeto ItemEvent invocante, en este caso un botón de radio. Al igual que el método getSelectedItem, debemos forzar al tipo apropiado:

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. Define el método itemStateChanged:
    public void itemStateChanged(ItemEvent ie)
      {//Opens method
        rb = (JRadioButton) ie.getItemSelectable();
       }//Closes method
    
  3. Graba el fichero.

El resultado de la selección de usuario se asigna a la variable rb, que utilizaremos más tarde en otros métodos que utilizan la información.

. Crear Métodos de Acceso Público

La clase UIWestPanel crea las características GUI para que el usuario interactúe, pero con funcionalidad limitada. Poder recolectar la entrada del usuario desde estas características gráficas, proporciona un significado para que otras clases obtengan esta información y trabajen con los datos. Veamos, hasta ahora hemos declarado los campos con la palabra clave private para protegerlos de una corrupción intencionada o no intencionada. ¿Cómo puede la clase que vamos a crear recuperar los datos si estos se daclaran como private y por lo tanto no están disponibles? A través de métodos de acceso public.

Estos métodos, también conocidos como métodos get, proporcionan una forma para que otras clases puedan recuperar y trabajar con datos private. Con estos métodos get, definimos la instrucción de cómo se puede usar el dato de forma exacta, luego las otras clases llaman a los métodos públicos y recogen los datos sólo a través de los métodos que hemos proporcionado. Es como si dijéramos, "Puedes tener esta información particular, pero esto es todo lo que puedes hacer con ella", mientras protegemos el resto de los datos.

No hemos proporcionado la funcionalidad de los botones de esta clase UIWestPanel, para escribir el objeto en un fichero y para recuperarlo. En su lugar, inicializamos los botones en esta clase, y proporcionamos un método public para acceder a los botones desde la clase donde estámos proporcionando la funcionalidad, incluyendo los títulos de los botones.

Para crear el botón en esta clase y proporcionar la funcionalidad en otra, definimos un método accesor que sólo devuelve un objeto JButton. Entonces la otra clase llama a este método y obtiene un objeto JButton en el que puede definir la funcionalidad.

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. Proporciona dos métodos de acceso público para los dos botones:
    //Accessor, or get, methods for GUI components
    public JButton getView () {return view;}
    public JButton getEnter () {return enter;}
    
  3. Graba el fichero

La clase que hemos creado ahora puede acceder a estos botones a través de sus métodos de acceso public.

. Acceder a la Entrada del Usuario

Después de que usuario introduzca los datos en los campos de texto, seleccione los ítems de los menús y los botones de radio, e introduzca el texto en el area de texto, recoge los datos y los almacena. Afortunadamente, muchos componentes GUI heredan un método getText que devuelve un String para un nombre de botón, el texto introducido en un campo de texto, o ítem de menú o de lista que ha sido seleccionado.

Por ejemplo, en la documentación de la clase JButton, descubrirás que hereda el método getText de la clase AbstractButton, el cual devuelve el texto del botón, como un String.

Para saber qué botón se pulsó, usamos el identificador con el operador punto y llamamos al método getText:

button1.getText();

Por supuesto que necesitamos almacenar el resultado en una variable de algún tipo:

String result = button1.getText();

En el panel Log Dives, estamos recogiendo mucha información. Pero llamar al método getText y asignar el resultado a una variable por cada ítem, y luego escribir cada ítem en un fichero consumiría mucho tiempo. En su lugar, podemos llamar al método getText sobre cada ítem y almacenar el resultado de todos ellos en una variable usando un objeto Vector. El beneficio adicional de almacenar los datos en un Vector es que éste puede almacenar distintos tipos de datos, mientras que un array sólo permite objetos del mismo tipo de dato.

Otra clase necesita acceder a los resultados de las entradas del usuario, por eso necesitamos una definición de un método accesor public.

. Definir el Método getUIFields

Definir un método accesor public para obtener los resultados de la entrada del usuario es una forma limpia de recoger los resultados. Como el método es public, se le puede llamar desde otra clase que necesite trabajar con los datos introducidos en esta clase.

Empecemos creando la cabecera del método, especificando que este método:

  • Tiene acceso public.
  • Devuelve un objeto Vector.
  • Tiene un nombre que refleja lo que hace.

Dentro del cuerpo del método, definimos el Vector para almacenar los resultados. Un objeto java.util.Vector es similar a un array, pero puede contener una variedad de objetos. Al igual que los arrays, contiene componentes a los que se puede acceder usando un índice. Al contrario que los arrays, el tamaño de un Vector crece y disminuye según añadamos o eliminemos elementos. La única restricción con un Vector es que sólo puede contener objetos, no tipos primitivos. Para incluir tipos primitivos en un Vector, debemos usar una clase envoltura.

Para añadir objetos a un Vector simplemente llamamos al método add:

Vector record = new Vector();
String name = "John Doe";
Integer age = new Integer(20);
record.add(name);
record.add(age);

Llamamos al método getText de cada variable asociada con los campos de texto, los menús y los botones de radio, excepto para una variable: private String s;

Recuerda que esta es una variable del tipo String para referenciar los resultados de un menú desplegable. Esta variable se utilizó en el método actionPerformed, por eso el resultado ya está asignado a s. En este caso, sólo necesitamos incluir la variable en el método getUIFields para almacenar s en el vector.

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. Define el método accesor que obtiene la entrada del usuario:
    // Collects the user input from fields and stores them in 
    // an array.
     public Vector getUIFields()
       { 
          //Collects text from GUI components and
          //stores each in a Vector.           
          Vector fieldValues = new Vector();
          fieldValues.add(rb.getText()); 
          fieldValues.add(date.getText());
          //The results were already collected and
          //stored in the variable s in the 
          //actionPerformed method above.
          fieldValues.add(s); 
          fieldValues.add(psiStart.getText()); 
          fieldValues.add(psiEnd.getText()); 
          fieldValues.add(psiUsed.getText());
          fieldValues.add(bottomTime.getText()); 
          fieldValues.add(diveNumberL.getText()); 
          fieldValues.add(vis.getText());  
          fieldValues.add(comments.getText());
          return fieldValues;
       }// closes getUIFields
    
  3. Graba el fichero.

Observa que la última línea de código return fieldValues; devuelve el objeto Vector.

. Contar Inmersiones

Cada vez que se pulsa el botón Save, se llama al método getCount, y se incrementa la variable count usando el operador ++. Imprime el resultado en un JLabel, en este caso diveNumberL, llamando al método setText con el operador punto. Necesitaremos el valor de este String, por eso usamos el método valueOf y le pasamos la referencia count. Este método devuelve count:

public int getCount()
  {
    count++;
    diveNumberL.setText(String.valueOf(count));
    return count;
   }

. Calcular el Aire Consumido

El siguiente método define y calcula la unidad de aire que el usuario ha utilizado en una inmersión sustrayendo la cantidad de PSI que quedan en el tanque al final de la inmersión de la cantidad que había al principio. Luego, muestra el resultado con el método setText de la clase JLabel.

Para poder realizar las operaciones matemáticas con los strings que devuelven los métodos getText, necesitamos utilizar clases envoltura para obtener un int para cada resultado. Estos resultados se asignan respectivamente a beginAir y a endAir. El resultado final se asigna a psiUsed y se muestra en un JLabel.

Después de que el usuario introduzca la información y pulse Enter, el usuario puede borrar la información introducida o teclear nuevos datos. Sin embargo, una mejor solución es hacer que los campos se limpien automáticamente después de que los datos se hayan escrito en un fichero y se pulse el botón Enter. Las instrucciones para limpiar los datos se definen en un método, y se llama a este método después de el objeto se haya escrito en un fichero.

El método getText devuelve un String para un objeto.
¿Qué método se puede utilizar para borrar de los campos de texto y las etiquetas los strings que contienen?
  A   setUI(ComponentUI newUI)
  B.   remove(Component comp)
  C   setText(String text)

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.