Programación en castellano
Inicio > Tutoriales > Nuevo en Java > New 2 Java: Construir una Aplicación: 4.- Leer y Escribir Ficheros y Manejar Excepciones
-Tutoriales

New 2 Java: Construir una Aplicación: 4.- Leer y Escribir Ficheros y Manejar Excepciones


Control de Distribución

¿Por qué la palabra clave this es un parámetro en el método addActionListener?

La plabra clave this se refiere al objeto actual. Algunas veces un método necesita referirse al objeto que lo invocó. La clase this (la clase CenterPanel) implementa el interface ActionListener, y la clase this contiene el método actionPerformed que ofrece instrucciones sobre lo que debe hacer el botón. El método addActionListener se refiere al objeto que lo invocó, es decir, este objeto CenterPanel.

Ahora que hemos creado todos los componentes para esta clase, necesitamos usar un controlador de distribución para organizar los componentes y añadir cada objeto a un panel.

. La clase Box y la Distribución

Un objeto Box es un contenedor de peso ligero que usa un objeto BoxLayout como su controlador de distribución. En otras palabras, no necesitamos llamar al método setLayout e inicializar la clase BoxLayout para este objeto particular. La clase Box proporciona varios métodos que son últiles para contenedores que usan BoxLayout e incluso para contenedores que no son Box. Esto hace que tenga más sentido que aprendamos los métodos estáticos de la clase Box.

Un objeto Box puede tener alineamiento horizontal y vertical, de derecha a izquierda, o de arriba a abajo, lo que podemos designar con métodos dinámicos en su creación:

Box box;
box = Box.createVerticalBox();

Box box;
box = Box.createHorizontalBox();

Además, la clase Box puede crear varios tipos de componentes invisibles que afectan a la distribución, como "glues" y "áreas rígidas".

Por ejemplo, si nuestros componentes Box tienen un tamaño fijo, usamos un componente glue para controlar las posiciones de componentes. Un componente glue se expande tanto como sea necesario para rellenar el espacio entre sus vecinos en un BoxLayout.

Si necesitamos una cantidad fija de espacio entre dos componentes, usamos un strut. Para un componente invisible que siempre toma la misma cantidad de espacio, usamos un rigid space.

Algunos métodos de glue:

  • createGlue:
    Create un componente "glue" invisible que puede ser útil en un Box cuyos componentes visibles tienen una anchura horizontal (para un box horizontal) o altura (para un box vertical).
  • createHorizontalGlue:
    Crea un componente glue horizontal.
  • createVerticalGlue:
    Crea un componente glue vertical.

Métodos para espacios rígidos:

  • createHorizontalStrut(int width):
    Crea un componente invisible de tamaño fijo. Normalmente usamos este método para forzar una cierta cantidad de espacio entre dos componentes.
  • createRigidArea(Dimension d):
    Crea un componente invisible que simpre tiene el tamaño especificado.
  • createVerticalStrut(int height):
    Crea un componente invisible de tamaño fijo. En un box horizontal, podríamos usar este método para forzar al box a tener la altura especificada.

Los métodos estáticos de arriba también se pueden utilizar con otros controladores de distribución para proporcionar el espacio necesario entre componentes. Para la clase CenterPanel, usamos un strut vertical para crear espacio entre el área de texto, el botón y la imagen.

Sigue estos pasos...
  1. Abre el fichero CenterPanel.java en tu editor de texto.
  2. Añade el siguiente código para crear un BoxLayout vertical y añadir los componentes al objeto Box:
    whiteshark = new JLabel("", new ImageIcon("images/gwhite.gif"), 
                               JLabel.CENTER);
    
    box = Box.createVerticalBox();
    box.add(scrollpane);
    box.add(Box.createVerticalStrut(10));
    box.add(saveAs);
    box.add(Box.createVerticalStrut(15));
    box.add(whiteshark);
    add(box);
         } // closes constructor
    

    Observa que esto finaliza el constructor para este panel.

Hasta ahora hemos creado:

  • Un área de texto que se puede editar.
  • Un ScrollPane y lo hemos configurado para mostrar siempre una barra de desplazamiento vertical.
  • Un botón Save Comments.
  • Una imagen de un tiburón.
  • Un controlador BoxLayout.
  • Un strut vertical para crear espacio entre el área de texto y el botón Save Comments.
  • Un strut vertical para crear espacio entre el botón Save Comments y la imagen del tiburón.

Lo que completa los detalles del GUI; pero este panel aún no hace nada cuando se ha tecleado el nuevo texto y se ha pulsado el botón Save Comments. Para esto, necesitamos crear el método actionPerformed y proporcionar los detalles de lo que queremos que suceda. En este caso, necesitamos que el texto añadido al área de texto se escriba en un fichero cuando el usuario pulse el botón Save Comments.

. Escribir Ficheros con JFileChooser

Un FileChooser proporciona un GUI para navegar por el sistema de ficheros. También proporciona una forma para que el usuario elija un fichero o directorio desde una lista o introduciendo un nombre de fichero o de directorio. JFileChooser, que desciende de Container y de Component, crea un componente Swing, Un objeto JFileChooser sólo representa el GUI para elegir ficheros. Nuestra aplicación es responsable de hacer algo con el fichero elegido, como abrirlo o grabarlo.

El objeto JFileChooser consiste en un diálogo que contiene una lista de ficheros, un campo de texto, un botón como Save u Open, un botón Cancel, y si se necesita, otros botones de selección.

Creamos un selector de ficheros inicializando un objeto de la clase JFileChooser:

JFileChooser jfc = new JFileChooser();

El díalogo se muestra en una ventana separada, y podemos seleccionar el tamaño usando el método setSize de la clase Component:

jfc.setSize(400, 300);

Como el diálogo se muestra en su propio frame necesitamos asignarlo a un contenedor de algún tipo y referenciarlo al contenedor padre, específicamente al objeto llamante, de la aplicación que lo llama. La clase Container también sirve para este propósito:

Container parent = saveAs.getParent();

La variable saveAs se refiere al JButton creado anteriormente.

Podemos elegir entre tres estilos de diálogos para un selector de ficheros llamando a uno de los tres métodos de la clase JFileChooser:

  • showOpenDialog(Component parent)
  • showSaveDialog(Component parent)
  • showDialog(Component parent)

El diálogo permanece activo hasta que el usuario lo cierra pulsando el botón Save o Cancel, haciendo doble click en un fichero o usando el botón de cerrar de sobre la barra de herramientas del diálogo. El valor de retorno de retorno de la pulsación de uno de estos botones es el siguiente:

  • APPROVE_OPTION
    Valor devuelto si se aprobó puslando Yes, OK, o Save.
  • CANCEL_OPTION
    Valor devuelto si se canceló la elección.

Cuando el valor de retorno es APPROVE_OPTION, el fichero seleccionado se puede recuperar con un método getSelectedFile. El método getAbsolutePath de la clase File devuelve la forma absoluta del path abstracto que se ha seleccionado en el selector de ficheros o se ha tecleado en el campo de texto. Veamos como funciona todo esto en el código que añadimos a la clase CenterPanel:

Sigue estos pasos...
  1. Abre el fichero CenterPanel.java en tu editor de texto.
  2. Añadimos el siguiente código para crear un objeto JFileChooser que permita al usuario nombrar un fichero y grabarlo:
    public void actionPerformed( ActionEvent evt ) { // open method
         
      JFileChooser jfc = new JFileChooser();
      jfc.setSize(400, 300);
      Container parent = saveAs.getParent();
      int choice = jfc.showSaveDialog(parent);
           
       if (choice == JFileChooser.APPROVE_OPTION)  {
               
         String filename =  jfc.getSelectedFile().getAbsolutePath();
    

Si el usuario pulsa Cancel, se cierra el diálogo y nada sucede. Si el usuario pulsa Save entonces se ejecuta el código de la sentencia if. Estamos listos para configurar los comentarios introducidos para salvarlos en un fichero que el usuario ha elegido, pero todavía no hemos escrito el código para escribir el texto en el fichero elegido.

. Escribir a Ficheros

Escribir en un fichero funciona de forma similar a leerlos. Recuerda que un stream de datos es de entrada o de salida. Normalmente usamos dos streams a la vez: uno para leer y realizar la validación (entrada) y otro para escribir (salida). Para crear un stream de salida, tenemos la clase Writer y sus descendientes:

Igual que BufferedReader, BufferedWriter mejora el rendimiento de un objeto Writer asociado proporcionando un buffer de almacenamiento temporal. Los datos se escriben en el buffer, y cuando éste se llena, los contenidos se escriben a un fichero o disco, lo que reduce el número de veces que se tienen que acceder al disco o a la red.

Un objeto BufferedWriter envuelve un objeto FileWriter, entonces se llama al método write para escribir los datos en el fichero especificado.

Como con los streams de lectura, el código va dentro de sentencias try/catch, y las excepciones deberían estar en el lugar para los métodos que llaman estas clases.

Sigue estos pasos...
  1. Abre el fichero CenterPanel.java en tu editor de texto.
  2. Añade el siguiente código para escribir los contenidos del área de texto a un fichero:
    if (choice == JFileChooser.APPROVE_OPTION) {
               
       String filename = jfc.getSelectedFile().getAbsolutePath();
       try
       { // opens try
         BufferedWriter bw =  new BufferedWriter(new FileWriter(filename));
         bw.write(comments.getText());
         bw.flush();
         bw.close();
        } // closes try
      catch (IOException ioe) { // open catch
       }// close catch
      }//close if statement
     } //close actionPerformed method
    } // Closes class
    

Aquí puedes ver la versión final de la clase CenterPanel.java.

Observa los métodos flush y close. Es importante que llamemos a estos métodos para segurarnos de que se vacía el buffer y se cierra el fichero para liberar recursos.

Usando la información de esta lección, también podrías añadir un botón Open, y un diálogo JFileChooser para abrir un fichero con comentarios grabados, y leer el contenido del fichero en el área de texto que usamos para escribirlos.

 
Patrocinados
 

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

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados