�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... |
---|
|
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... |
---|
|
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... |
---|
Aqu� puedes ver la versi�n final de la clase |
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.