Completar la Clase NorthPanel
Para llamar al método estático showMessageDialog de la clase JOption, escribimos:
JOptionPane.showMessageDialog( null,
"File divedetails.txt not found.",
null,
JOptionPane.ERROR_MESSAGE );
Con el formato anterior llamamos a showMessageDialog, no necesitamos crear un ejemplar de la clase JOptionPane. Sin embargo, podemos crear cajas de diálogo más complejas con un ejemplar de la clase JOptionPane.
Completar la clase NorthPanel
Los bloques try/catch y las instrucciones para imprimir en la consola están en su lugar. Ahora, insertaremos la llamada al método showMessageDialog en los dos bloques catch. En caso de que el fichero solicitado no se encuentre, imprimimos un mensaje en la consola y mostramos un diálogo para informar al usuario del problema.
| Sigue estos pasos... |
- Abre el fichero NorthPanel.java en tu editor de texto.
- Antes de las llamadas a System.out.println en el bloque catch, llama al método showMessageDialog, proporcionando los parámetros mostrados en negrita:
{//open catch
JOptionPane.showMessageDialog( null,
"File divedetails.txt not found.",
null, JOptionPane.ERROR_MESSAGE );
System.out.println(fnfe);
} //close catch
- También llama al método showMessageDialog en el segundo bloque catch:
{//open catch
JOptionPane.showMessageDialog( null,
"Problem Reading File.", null,
JOptionPane.ERROR_MESSAGE );
}//close catch
- Graba y compila con:
javac NorthPanel.java
|
Cuando ejecutamos la aplicación aparece un diálogo y un mensaje en la consola, avisándonos que no encuentra el fichero.
Todavía hay otra forma de manejar esta condición. Si no se encuentra el fichero, podemos forzar a la aplicación a crear el fichero con una llamada a un método de las clase File:
createTempFile(String prefix, String suffix)
Este método crea un fichero vacío en el directorio por defecto de ficheros temporales, usando el prefijo y el sufijo dado para generar su nombre.
| Sigue estos pasos... |
- Abre el fichero NorthPanel.java en tu editor de texto.
- Vuelve a la definición del método readFileIntoTextArea, y añade la llamada al método
createNewFile sobre el objeto file, mostrada abajo en negrita:
private void readFileIntoTextArea() { // opens method
try
{ //opens try
File f = new File("divedetails.txt");
f.createNewFile();
br = new BufferedReader (new FileReader(f));
- Compila el fichero con:
javac NorthPanel.java
Este es un ejemplo de como debería ser tu fichero ahora.
|
Ahora cuando ejecutamos la aplicación, el resultado concordará con esta imagen. Obviamente, crear un fichero cuando no existe normalmente no es una buena idea. Hay mejores circunstancias para el método createNewFile, pero hemos aprendido cómo manejar la condición de fichero no encontrado de varias formas:
- Imprimiendo un mensaje de error en la consola.
- Creando un diálogo desplegable que alerta al usuario sobre fichero desaparecido.
- Creando el fichero deseado, aunque vacío.
El objetivo era leer texto en un área de texto y mostrarlo en la pantalla. Como createNewFile ha creado un fichero con el nombre correcto para nosotros, ábrelo e introduce algún texto. Puedes usar el texto suministrado o crearlo por tí mismo.
| Sigue estos pasos... |
- Abre el fichero divedetails.txt en tu editor de texto.
- Añade el siguiente código, o crea el tuyo propio:
Each dive is a memorable experience. Save the
details of your dives by recording them here.
Track your technical skills and experiences
with sea life and other divers in the fields
below.
- Ejecuta la aplicación de nuevo.
|
Ahora aparece el texto en el área de texto en la parte superior del panel Log Dives. Como el fichero existe con texto, funciona el código del bloque try, y se lee el texto dentro del área de texto especificada. Si le sucediera algo al fichero, si se corrompe o si se borra o se renombra accidentalmente, el código fluye dentro del bloque catch apropiado y ejecuta ese código.
La clase CenterPanel
La clase NorthPanel está completa y lee el fichero y muestra el texto en el área de texto de la región norte del BorderLayout del objeto Dives. El objeto CenterPanel escribe experiencias de buceo en un fichero, e incluye lo siguiente:
- Un área de texto con paneles desplazables que se puede editar.
- Un botón Save Comments.
- Una imagen de un tiburón.
- Un controlador de distribución Boxlayout.
Hemos creado un área de texto con texto codificado dentro del display, y hemos diseñado un área de texto que lee sus contenidos desde un fichero. La siguiente área de texto que vamos a crear contiene un área editable para que el usuario introduzca texto y una barra de desplazamiento para que el usuario pueda desplazarse cuando el texto va más allá de los límites de tamaño del propio área de texto.
Una vez que el buceador ha metido el texto en el ára de texto, pulsa el botón Save Comments, y el método
actionPerformed muestra una caja especial para que el usuario introduzca el nombre del fichero, grabe el fichero en una localización deseada, luego pulsa Save. Entonces el texto se escribe en un fichero creado en el sistema.
Como el botón Save Comments está asociado con un objeto listener, el CenterPanel debe o implementar el interface ActionListener o contener una clase interna que implemente el interface ActionListener. El código del método actionPerformed es corto y correcto, por eso implementar esta clase con el interface ActionListener es suficiente.
| Sigue estos pasos... |
- Abre el fichero CenterPanel.java en tu editor de texto.
- Añade el código en negrita de abajo para implementar el interface ActionListener:
public class CenterPanel extends JPanel implements ActionListener { // Opens class
- Añade las siguientes variables:
private JTextArea comments;
private JScrollPane scrollpane;
private JButton saveAs;
private JLabel whiteshark;
private Box box;
- Empieza el constructor:
public CenterPanel() { // open constructor
} // closes constructor
|
Ahora estamos listos para crear los contenidos de nuestro constructor para construir los componentes GUI necesarios.
Área de Texto Editable y con Barras de Desplazamiento
Creamos un área de texto de la forma usual, excepto en que esta vez el método setEditable debería seleccionarse a true, que permite a los buceadores introducir el texto sobre sus sesiones en el área de texto. Además, este área de exto está inicializada con texto que explica el propósito de este área de texto.
Una vez que está construida el área, se añade un objeto scrollBar, un ejemplar de la clase JScrollPane. En otras palabras, las barras de desplazamiento no son parte de la vista editable de la ventana. En su lugar, el área de texto se pasa a un objeto que crea las barras de desplazamiento y maneja sus funcionalidades.
Un ScrollPane se usa para mostrar un componente con barras de desplazamiento internas para desplazar el componente hacia todos los lados. Un ScrolPane es un objeto del tipo JScrollPane, que extiende la clase JComponent.
La clase JScrollPane dispone de los siguientes constructores:
- JScrollPane()
Crea un JScrollPane vacío con barras de desplazamiento veritical y horizontal que aparecen sólo cuando se necesitan.
- JScrollPane(Component view)
Crea un JScrollPane que muestra el contenido del componente especificado con barras de desplazamiento vertical y horizontal que aparecen siempre que el área del componente es mayor que la vista.
- JScrollPane(Component view, int vsbPolicy, int hsbPolicy)
Crea un JScrollPane que muestra la vista del componente en un viewport con la posición de la vista controlada por un par de barras de desplazamiento.
- JScrollPane(int vsbPolicy, int hsbPolicy)
Crea un JScrollPane con la política de barras especificada.
Políticas se refiere a las propiedades del ScrollPane, o al esquema a utilizar, como si las barras deberían aparecer siempre o sólo cuando se las necesita.
La clase JScrollPane() implementa el interface ScrollPaneConstants. Estas constantes muestran las barras de desplazamiento siempre, sólo cuando son necesarias o bajo necesidades básicas o nunca. Seleccionamos las constantes de dos formas posibles:
- Dentro del constructor:
scrollPane = new JScrollPane(panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane. HORIZONTAL_SCROLLBAR_AS_NEEDED);
- LLamando a un método:
scrollpane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
| Sigue estos pasos... |
- Abre el fichero CenterPanel.java en tu editor de texto.
- Añade el código en negrita de abajo para crear el área de texto editable:
public CenterPanel() { // open constructor
setBackground(Color.white);
comments = new JTextArea("Enter comments, such as " +
"location, water conditions, sea life you observed," +
" and problems you may have encountered.", 15, 10);
comments.setLineWrap(true);
comments.setWrapStyleWord(true);
comments.setEditable(true);
comments.setFont(new Font(
"Times-Roman", Font.PLAIN, 14));
- Añade este código para añadir el área de texto al objeto ScrollBar:
scrollpane = new JScrollPane(comments);
scrollpane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
El último componente que necesitamos crear y añadir es el botón Save Comments. Cuando se pulsa este botón, se llama al método actionPerformed. Más adelante definiremos que este método traiga un componente especial que le permita al usuario nombrar un fichero que desee salvar.
La variable para el botón que hemos creado se usa como el nombre de referencia saveAs. Este botón está asociado con un objeto oyente a través del método addActionListener, como hemos echo en anteriores partes del tutorial. Entonces se crea el objeto imagen con un objeto etiqueta.
| Sigue estos pasos... |
- Abre el fichero CenterPanel.java en tu editor de texto.
- Añade el siguiente código en negrita, para crear un botón, asociarlo con un objeto oyente, y luego un objeto image sobre un objeto label:
saveAs = new JButton("Save Comments");
saveAs.addActionListener( this );
whiteshark = new JLabel("", new ImageIcon("images/gwhite.gif"),
JLabel.CENTER);
|
|
¿Por qué la palabra clave this es un parámetro en el método addActionListener? |
|
|