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

En El cap�tulo Anterior de esta serie, aprendimos como manejar problemas y condiciones, y ya sabemos leer y escribir ficheros. Tambi�n aprendimos a utilizar la distribuci�n Box, c�mo crear ventanas desplegables para mensajes de aviso, y c�mo usar la clase JFileChooser para nombrar nuevos ficheros.

La parte 5 refuerza estos conceptos y presenta la segunda parte del panel Log Dives, mostr�ndonos como:

  • Separar el interface de la implementaci�n
  • Crear un objeto DiveRecord.
  • Serializar objetos y escribirlos en ficheros, y luego leerlos de nuevo y ponerlos en el GUI.
  • Usar objetos Vector para almacenar la entrada.
  • Crear men�s desplegables y botones de radio.

.�Empezamos

En esta secci�n del tutorial modificaremos dos clases que creamos anteriormente: Dives.java y CenterPanel.java. Adem�s, definiremos nuevas clases, renombrando la clase contenedora WestPanel.java como DiveHandler, y creando otras dos clases llamadas UIWestPanel.java y DiveRecord.java.

  • Dives.java: Inicializa las dos clases (UIWestPanel y DiveHandler) que componen el panel Log Dives.
  • UIWestPanel.java: Inicializa el GUI, es decir, los campos de texto, los botones de radio, el men� desplegable, y los botones para introducir y ver nuestras sesiones de buceo.
  • CenterPanel.java: Ya no es necesaria. El JTextArea y la imagen del tibur�n se ha movido a la clase UIWestPanel.
  • DiveRecord.java: Modela lo que es un objeto DiveRecord.
  • DiveHandler.java: Porporciona funcionalidades, como la recolecci�n de datos desde el objeto UIWestPanel, y graba el objeto DiveRecord en un fichero.

Esta lecci�n nos muestra como construir un interface de usuario que permite grabar en un fichero la informaci�n introducida de cada inmersi�n, y una clase separada que recolecta los datos desde el interface de usuario en un objeto DiveRecord a trav�s de los m�todos get p�blicos. Por �ltimo, crearemos el c�digo que escriba el objeto en un fichero, para que posteriormente pueda ser le�do de vuelta el GUI.

El panel Log Dives se construye en cuatro pasos b�sicos:

  1. Modificar las clases que creamos anteriormente.
  2. Crear una clase DiveRecord para el objeto DiveRecord.
  3. Contruir los componentes GUI para la entrada de usuario
  4. Crear una clase que proporcione la funcionalidad para los botones, recoja los datos, grabe la colecci�n de datos como un objeto, y escriba el objeto en un fichero. Posteriormente el objeto se pasa de vuelta al GUI.
Nota:
Se asume que tienes intalada la Java 2 Platform, Standard Edition (J2SE) en tu sistema, y que has completado y compilado los ejemplos de las secciones anteriores de este tutorial.

.�Hacer las Modificaciones

En la secci�n anterior aprendimos como utilizar JFileChooser, y como grabar texto en un fichero. El CenterPanel cre� el �rea de texto para que el usuario introdujera el texto. Debemos mantener el c�digo que crea el �rea de texto y la imagen del tibur�n, pero ya no necesitaremos el resto del c�digo. Como el �rea de texto es una caracter�stica GUI, necesitamos incluir el c�digo junto con las otras caracter�siticas GUI de este de panel.

Sigue estos pasos...
  1. Abre el fichero de la clase CenterPanel.java que creamos en la secci�n anterior.
  2. Elimina el c�digo del �rea de texto y la imagen del tibur�n, y graba el c�digo en un fichero separado, por ahora.
  3. Abre el fichero Dives.java que creamos en la secci�n anterior.
  4. Comenta o elimina la l�nea que inicializa la clase CenterPanel, y la l�nea que a�ade el objeto CenterPanel al panel, como se muestra en negrita m�s abajo.
  5. Cambia NorthPanel por DiveHandler, como se muestra en negrita:
  6. public class Dives extends JPanel
    { // Opens class
        public Dives()
       {// Opens constructor
        // Sets the layout for the page and the
        // background to white.
        setLayout(new BorderLayout());
        setBackground(Color.white);
    
         // Initializes the placeholder classes.
         NorthPanel northPanel = new NorthPanel();
         //CenterPanel centerPanel = new CenterPanel();
         //NorthPanel northPanel = new NorthPanel();
         DiveHandler ui = new DiveHandler();
    
         // Adds class objects to panel regions.
         add("North", northPanel);
         add("West", ui);
         //add("Center", centerPanel);
       } // Closes constructor
    
  7. Graba el fichero.

Nota:
No podr�s compilar esta clase hasta que hayamos creado la clase DiveHandler.
Ya no necesitaremos la clase CenterPanel.

.�Separar el Interface de la Implementaci�n

Hasta ahora hemos construido cada panel desde una sola clase definida por el usuario. Estas clases inclu�an el c�digo tanto para los componentes GUI, los datos y las funcionalidades del panel. Una forma mejor del dise�o de software implica la arquitectura Modelo, Vista, Controlador (MVC).

La idea que hay detr�s de MVC es separar los componentes gr�ficos (o vista) de los datos (o modelo), y utilizar un controlador para tratar con la interacci�n del usuario y modificar el modelo o la vista de la forma apropiada.

  • El modelo almacena los datos que define el componente.
  • La vista crea la representaci�n visual del componente.
  • El controlador trata de la interacci�n del usuario con los componentes y luego actualiza el modelo y/o la vista seg�n las necesidades, dependiendo de la entrada del usuario.

Por supuesto, algunas aplicaciones son demasiado peque�as o tienen muy poca funcionalidad, por lo que no merece la pena utilizar MVC. Pero para este panel, MVC nos ir� muy bien.

  • UIWestPanel.java: crear� los componentes GUI para que el usuario introduzca la informaci�n. Esta clase act�a como la vista.
  • DiveRecord.java: contiene un constructor para crear un objeto DiveRecord que eventualmente contiene la entrada del usuario, y tiene los m�todos p�blicos get y set necesarios para acceder a datos individuales. Esta clase define un modelo para un objeto DiveRecord.
  • DiveHandler.java es el controlador. Esta clase ejemplariza las clases UIWestPanel y DiveRecord. Adem�s, proporciona las funcionalidades de los botones de la clase UIWestPanel llamando a los m�todos p�blicos set y get de las otras clases.

.�Dise�ar el objeto

Ahora que ya hemos realizado los cambios necesarios en las dos clases creadas anteriormente, est�mos listos para dise�ar un nuevo objeto dive. Este es el plano de lo que consiste un objeto dive. Tambi�n nos dice que tipo de caracter�sticas GUI necesitaremos para recolectar informaci�n sobre el buceador, porque cada objeto dive s�lo consta de datos de inmersiones.

Para decidir que datos necesitamos pasar al constructor de la clase DiveRecord, determinamos la informaci�n m�s com�n que los buceadores proporcionan sobre cada sesi�n de buceo, y anotamos de que tipo de dato se trata, de esta forma:

  • Tipo de inmersi�n, como desde un bote o desde la playa (String t).
  • Fecha en que tuvo lugar la inmersi�n (String d).
  • La profundidad alcanzada en esta inmersi�n (int dth).
  • La presi�n inicial que ten�a el tanque al empezar la inmers�n (int s).
  • La presi�n final que ten�a el tanque al finalizar la inmersi�n (int e).
  • La cantidad total de aire consumido (int u).
  • La duraci�n total de la inmersi�n (int b).
  • El n�mero de inmersi�n de ese buceador (int c).
  • Visibilidad del agua (int v).
  • Comentarios sobre la inmersi�n (String cts).

A cada dato anterior se la asignado un tipo de dato, como un String o un int, y tambi�n se le ha asignado un identificador. El objeto dive se construir� en el momento en que el buceador introduzca toda la informaci�n.

Entonces esta clase necesita incluir lo siguiente:

  • Un constructor.
  • M�todos get para cada dato.

Esto es todo. Las instrucciones para lo que se deber�a hacer con esta informaci�n van en la clase del controlador que construiremos al final.

Esta clase DiveRecord proporciona un constructor para los datos que est� recolectando, y m�todos para trabajar con esos datos. Como vamos a escribir este objeto en un fichero usando serializaci�n, esta clase necesita implementar el interface Serializable.

.�Serialiaci�n de Objetos

Usualmente los objetos existen mientras el programa que los cre� est� activo y ejecut�ndose. La habilidad de un objeto para grabar, o registrar su estado para que pueda ser reproducido en la misma o en otra aplicaci�n es la persistencia. Un objeto puede persistir grabando los valores que describen su estado en un fichero. Por ejemplo, digamos que tenemos una clase Coche con la que los usuarios pueden crear sus propios objetos Coche atendiendo a sus necesidades. La persistencia permitir�a que cada ejemplar de Coche pudiera grabar su fabricante, modelo, color, etc y registrar el estado de cada Coche para utilizarlo m�s tarde.

Podemos grabar el estado de un objeto a trav�s de su serializaci�n, que su representaci�n en una serie ordenada de bytes. Si esa informaci�n de estado es otro objeto, tambi�n se graban las selecciones actuales para ese objeto, etc., hasta que todos sean tipos de datos primitivos. Los m�todos y las variables de estado static no se graban. Los m�todos son el comportamiento de un objeto, no el estado, y por eso no se graban. Las variables est�ticas, son informaci�n sobre la clase, no del ejemplar y tampoco se graban.

La serialiaci�n es ideal para grabar los datos de la inmersi�n porque s�lo necesitamos los datos grabados. Un DiveRecord es simplemente un objeto con esos datos.

Si una clase implementa el interface java.io.Serializable, es serializable. No hay m�todos en este interface por eso s�lo sirve como un marcador. Sin embargo, simplemente implementar el interface no es suficiente. Las variables de ejemplar de esa clase tambi�n debe ser serializables; si no es as�, cuando intentemos serializar el estado, se lanzar� un excepci�n.

M�s adelante veremos los m�todos que escriben y leen el objeto hacia y desde un fichero. Por ahora, s�lo debemos asegurarnos de que nuestra clase DiveRecord implemente el interface Serializable.

Sigue estos pasos...
  1. Abre tu editor de texto, y crea una clase DiveRecord importando los siguientes paquetes e implementando el interface Serializable:
    //Represents a record of a dive
    package divelog;
    import java.io.*;
    import java.io.Serializable;
    
    public class DiveRecord implements Serializable
      {
    
  2. A�ade las siguientes variables de ejemplar:
        //Instance variables
        private String date, type, cts;
        private int depth, start, end, used, 
           time, count, vis;
    
  3. Crea un constructor por defecto que llame a un m�todo setDive:
        public DiveRecord ()
         {
           setDive();
         }
    
  4. Implementa un m�todo setDive que no tome ning�n argumento, pero que contenga las variables listadas arriba:
        public void setDive()
         {
           type = "";
           date = "00/00/00";
           depth = 00;
           start = 0000;
           end = 0000;
           used = 0000;
           time = 00;
           count = 000;
           vis = 00;
           cts = "";
         }
    
  5. Ahora crea un m�todo setDive que tome todas esas variables como argumentos:
        public void setDive (String t,String d, int dth, 
                    int s, int e, int u, int bt, 
                    int c, int v, String cts)
            {
              
              this.type = t;
              this.date = d;
              this.depth = dth;
              this.start = s;
              this.end = e;
              this.used = u;
              this.time = bt;
              this.count = c;
              this.vis = v;
              this.cts = cts;
              
             }
    
  6. Sobreescribe el m�todo toString de la clase String para que devuelva los datos asociados con las variables de ejemplar:
        public String toString()
         {
           return type + date + depth + start + 
              end + used + time + count + vis + cts;
         }
    
  7. Ahora proporciona un m�todo get para cada variable de ejemplar:
        public String getDte()
          {
            return date;
          }     
        public int getDepth ()
          {
            return depth;
          }
         public String getType ()
         {
           return type;
          }
         public int getStart ()
          {
            return start;
           }
        public int getEnd ()
          {
            return end;
           }
           
         public int getUsed ()
           {
             return used;
            }
         public int getTime()
           {
             return time;
           }
         public int getCount ()
           {
             return count;
            }
         public int getVis()
           {
              return vis;
            }
        public String getComments()
          {
             return cts;
           }
       }//closes class     
    
  8. Graba el fichero.
  9. Compila el fichero DiveRecord.java.

Tu nueva clase deber�a parecerse a esta DiveRecord.java.

Nota:
Observa la palabra clave this usada en el constructor. Los nombres de argumentos ocultan los nombres de las variables miembro. Por eso los identificadores dentro del cuerpo del constructor se refieren a los argumentos no a las variables miembro. Para acceder a las variables miembro, debemos referenciarlas a trav�s de this, el objeto actual. T�picamente, dentro del cuerpo de un m�todo, podemos referenciar directamente las variables miembro del objeto. Sin embargo, algunas veces necesitamos distinguir el indentificador de la variable miembro si uno de los argumentos del m�todo tiene el mismo nombre que la variable miembro. Esto simplemente se hace utilizando la palabra clave this.

Esto completa el modelo de nuestro objeto. Ahora que hemos completado el modelo, necesitamos crear los componentes GUI que el usuario necesita para introducir los datos.

.�Construir los componentes GUI

El panel Logs Dives contiene un �rea de texto para los comentarios de las inmersiones y otros componentes gr�ficos de entrada como con men� desplegable para elegir el nivel de profundidad, dos botones de radio para elegir entre las inmersiones desde bote o desde la playa, y los campos de texto familiares para registrar la fecha, el tiempo de inmersi�n, la visibilidad y una etiqueta que se rellena por un m�toco que crearemos para que rellene autom�ticamente el n�mero de inmersi�n. Si, por ejemplo, est�mos construyendo, un diario de ejercicios, podemos cambiar estas caracter�sticas para grabar las calor�as quemadas, los ejercicios aer�bicos y anaer�bicos, etc. Puedes cambiar estas caracter�sticas para que se adapten a tu aplicaci�n.

M�s delante, crearemos una clase UIWestPanel para definir los componentes GUI para que un buceador introduzca los datos de sus inmersiones.

Lee el API de la clase JComboBox. �Qu� l�nea de c�digo es la correcta para hacer que el combobox sea editable?
 A  JComboBox week = new JComboBox(SetEditable);
 B  week.setEditable(true)
 D  week.setEditable == true;

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO