| Editor de texto |
| Paso 3: Operativa |
Creación de un componente Swing especializado en explorar el sistema de ficheros de nuestro ordenador
Buscamos el componente JFileChooser en la paleta de componentes Swing y en vez de desplazarlo al interior de la parte gráfica del EditorPanel, lo colocamos en la zona que queda vacía por debajo del EditorPanel. A este componente lo vamos a llamar jfcEditor

como podemos observar en la ventana Inspector el nuevo componente está debajo de Other Components. Esto es así por que queremos que este componente sólo esté visible y operativo cuando en nuestro caso hagamos clic sobre el botón Abrir
![NetBeans 6 - Ver componente JFileChooser - Inspector | Other Components | [JFileChooser]](images/netbeansJFileChooser-b.png)
En la ventana de propieadades indicaremos que la propiedad currentDirectory tiene el valor C:\isg\\j2se\prosjava\prostreams para que cuando el Objeto jfcEditor se haga visible muestre esta jerarquía de directorios directamente.
Este es el código generado por el IDE de la Clase EditorPanel
package paqstreams;
public class EditorPanel extends javax.swing.JPanel {
public EditorPanel() {
initComponents();
}
private void initComponents() {
jfcEditor = new javax.swing.JFileChooser();
pnlNorte = new javax.swing.JPanel();
btnAbrir = new javax.swing.JButton();
pnlCentro = new javax.swing.JScrollPane();
txaEditor = new javax.swing.JTextArea();
jfcEditor.setCurrentDirectory(new java.io.File("C:\\j2se\\prosjava\\prostreams"));
setLayout(new java.awt.BorderLayout());
pnlNorte.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
btnAbrir.setIcon(new javax.swing.ImageIcon("C:\\j2se\\prosjava\\prostreams\\abrir.gif"));
btnAbrir.setText("Abrir");
pnlNorte.add(btnAbrir);
add(pnlNorte, java.awt.BorderLayout.NORTH);
pnlCentro.setViewportView(txaEditor);
add(pnlCentro, java.awt.BorderLayout.CENTER);
}
private javax.swing.JButton btnAbrir;
private javax.swing.JFileChooser jfcEditor;
private javax.swing.JScrollPane pnlCentro;
private javax.swing.JPanel pnlNorte;
private javax.swing.JTextArea txaEditor;
}
|
Interacción con un componente Swing especializado en explorar el sistema de ficheros de nuestro ordenador
Ahora vamos a crear un oyente de tipo ActionListener que sea avisado a través del método actionPerformed(...) cuando el usuario haga clic sobre el botón Abrir
Compara tus pasos para la obtención de este objetivo con la solución propuesta
Este es el código generado por el IDE de la Clase EditorPanel
package paqstreams;
public class EditorPanel extends javax.swing.JPanel {
public EditorPanel() {
initComponents();
}
private void initComponents() {
pnlNorte = new javax.swing.JPanel();
btnAbrir = new javax.swing.JButton();
pnlCentro = new javax.swing.JScrollPane();
txaEditor = new javax.swing.JTextArea();
jfcEditor.setCurrentDirectory(new java.io.File("C:\\j2se\\prosjava\\prostreams"));
setLayout(new java.awt.BorderLayout());
pnlNorte.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
btnAbrir.setIcon(new javax.swing.ImageIcon("C:\\j2se\\prosjava\\prostreams\\abrir.gif"));
btnAbrir.setText("Abrir");
btnAbrir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAbrirActionPerformed(evt);
}
});
pnlNorte.add(btnAbrir);
add(pnlNorte, java.awt.BorderLayout.NORTH);
pnlCentro.setViewportView(txaEditor);
add(pnlCentro, java.awt.BorderLayout.CENTER);
}
private void btnAbrirActionPerformed(java.awt.event.ActionEvent evt) {
}
private javax.swing.JButton btnAbrir;
private javax.swing.JFileChooser jfcEditor;
private javax.swing.JScrollPane pnlCentro;
private javax.swing.JPanel pnlNorte;
private javax.swing.JTextArea txaEditor;
}
|
Ahora tenemos que implementar el método btnAbrirActionPerformed(...). Para ello tenemos que tener en cuenta todo lo siguiente:
- querremos invocar al método UtilEntradaSalida.cargarFichero(File fileIn, JTextArea textArea1)
- como podemos observar uno de los argumentos del método cargarFichero(...) es un Objeto de tipo File que nos lo proporcionará un método del Objeto JFileChooser apuntado por la variable de referencia jfcEditor
- para ello primero tendremos que invocar al método jfcEditor.showOpenDialog(this)
- si nos fijamos este método retorna un valor de tipo int
- este valor representa la forma en que hemos salido del JFileChooser
- si por ejemplo hemos salido:
- cerrando la ventana del JFileChooser haciendo clic en el aspa o en el botón Cancelar entonces devuelve un
JFileChooser.CANCEL_OPTION
- haciendo clic sobre el botón Abrir de la ventana del JFileChooser entonces devuelve un
JFileChooser.APPROVE_OPTION
- una vez hemos elegido el fichero por ejemplo fich1.txt salimos del JFileChooser y nos gurdamos el valor de retorno de la invocación al método showOpenDialog(...) en una variable de tipo int
- entonces miramos de que forma hemos salido de la ventana JFileChooser
- si hemos salido haciendo clic sobre el botón Abrir, entonces invocamos al método UtilEntradaSalida.cargarFichero(File fileIn, JTextArea textArea1)
- como ya hemos comentado el Objeto de tipo JFileChooser apuntado por la variable de referencia jfcEditor tiene un método que nos devuelve un Objeto de tipo File y como segundo argumento le pasamos el Objeto de tipo JTextArea apuntado por la variable de referencia txaEditor
Compilamos la Clase EditorPanel, ejecutamos la Clase EditorMarc y utilizamos la aplicación para mostrar el contenido de un fichero de texto en el campo de texto de nuestro editor.
Compara tu código con la solución propuesta
Como estamos creando una aplicación de ventanas de sobremesa lo natural es que si ha habido un error de entrada/salida lo mostremos con un cuadro de diálogo de tipo modal al usuario que está utilizando la aplicación. Esto en Java se realiza a través del método showMessageDialog(...) de la Clase JOptionPane. Esta es la signatura de este método
public static void showMessageDialog(Component parentComponent,
Object message,
String title,
int messageType)
|
- Component parentComponent
- determina el marco (frame) en el cual el cuadro de diálogo se va a mostrar
- si el componente padre no tiene marco se utilizará un marco por defecto
- en nuestro caso podemos escribir this o null
- Object message
- aquí mostramos un mensaje para que el usurio lo lea. Como este tipo de cuadro de diálogo es modal, el usuraio no puede volver a la aplicación hasta que no haya hecho clic en el botón Aceptar
- en nuestro caso este será acotado con comillas dobles para así representar a un String
- "Ha habido un error de lectura al leer el fichero"
- String title
- aquí mostramos el título del cuadro de diálogo
- en nuestro caso este será acotado con comillas dobles para así representar a un String
- int messageType
- aquí mostramos el tipo del mensaje.
- estos son los diferentes tipos:
- ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE, o PLAIN_MESSAGE
- en nuestro caso este será ERROR_MESSAGE
Para forzar la visión de este error aunque no haya ningún problema de entrada/salida, la invocación momentaneamente la podemos realizar en la línea siguiente a la llamada al método cargarFichero(...)
Este es el cuadro de diálogo indicándonos que ha habido un error de entrada/salida

Ahora tenemos que añadir el código necesario en el método btnAbrirActionPerformed(...) de la Clase EditorPanel para mostrar el cuadro de diálogo en cuestión
Compara tu código con la solución propuesta