| Editor de texto |
| Paso 1: Operativa |
Creación de la clase EditorMarc
Como vamos a trabajar con la API Swing de Java para realizar este editor, la Clase EditorMarc va a heredar de la Clase javax.swing.JFrame.
- los componentes Swing están incluidos en el paquete javax.swing
- a partir de la versión 1.1 del JDK de Java se decidió que todas las extensiones del lenguaje Java que no exixtian en la primera versión, la 1.0, llevarían la letra x como sufijo a la palabra java en los paquetes. Por tando javax
El editor de texto lo crearemos en una ventana siguiendo los siguientes pasos:
nos situamos en la ventana Projects y con el botón derecho del ratón seleccionamos el paquete paqstreams. Entonces elegimos New | JFrameForm...

se abre el cuadro de diálogo New JFrame Form. En el campo de texto Class Name: introducimos el nombre de la Clase EditorMarc y finalmente hacemos clic sobre el botón 

Para que el Frame (marco, ventana) tenga dimensiones , vamos a modificar el código perteneciente al método main(...) tal y como hicimos en la aplicación del selector de colores. Tenemos que indicar:
- el tamaño del marco: 400 de ancho y 300 de alto
- el título del marco: Editor de Texto
- y finalmente lo mostramos en la pantalla de nuestro ordenador
Este es el código de la Clase EditorMarc
package paqstreams;
public class EditorMarc extends javax.swing.JFrame {
public EditorMarc() {
initComponents();
}
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
pack();
}
public static void main(String args[]) {
EditorMarc marco = new EditorMarc();
marco.setSize(400, 300);
marco.setTitle("Editor de texto");
marco.setVisible(true);
}
} |
Creación de la clase EditorPanel
Todos los entornos de desarrollo RAD (Rapid application development) son de gran ayuda a la hora de crear nuestras aplicaciones gráficas. Pero todos sin excepción caen en el mismo error. Todo el código relacionado con la parte gráfica visual lo escriben en un mismo fichero.
- esto provoca que el software que estamos creando ahora no pueda ser reutilizable en ningún otro proyecto de forma ágil y flexible
- imaginemos que un cliente dentro de 6 meses nos pìde que le añadamos un editor de texto en su aplicación
- si seguimos la forma de trabajar de los entornos RAD, esto nos resultará casi imposible porque no podemos incrustar un JFrame dentro de otro JFrame
La solución a este inconveniente pasa por crear el editor en un panel, y que este panel sea un JavaBean que lo colocamos en nuestra paleta de componentes y puede ser reutilizado siempre que queramos.
Para crear la Clase EditorPanel
- nos situamos en la ventana Projects y con el botón derecho del ratón seleccionamos el paquete paqstreams
- elegimos new | Other...
- se abre el cuadro de diálogo New File y abrimos la carpetas Swing GUI Forms. Entonces elegimos JPanel Form y hacemos clic sobre el botón

- se abre el cuadro de diálogo New JPanel Form. En el campo de texto Class Name: introducimos el nombre de la Clase EditorPanel y finalmente hacemos clic sobre el botón

Asociar el JavaBean EditorPanel a la Aplicación EditorMarc
El JavaBean EditorPanel lo vamos a añadir a la paleta de componentes en la pestaña Beans según el Apéndice - Insertar un JavaBean creado por nosotros en la Paleta de componentes.
Ahora vamos a indicar que el marco EditorMarc tiene como Gestor de Organización BorderLayout. Para ello seleccionamos de la ventana Inspector [JFrame] | Set Layout | BorderLayout

Después pasamos el nuevo JavaBean de la paleta al interiror del marco EditorMarc.
A partir de ahora tenemos que tener muy claro que cualquier modificacón realizada sobre el editor se realizará en el JavaBean EditorPanel, y que la Clase EditorMarc actúa como una simple contenedora del editor. De esta forma, y siguiendo el ejemplo planteado con anterioridad, si un cliente dentro de 6 meses nos pide un editor de texto, será tan simple como arrastrarlo de nuestra paleta de componenetes a la Aplición de nuestro cliente.
Este es el código de la Clase EditorMarc
package paqstreams;
public class EditorMarc extends javax.swing.JFrame {
public EditorMarc() {
initComponents();
}
private void initComponents() {
editorPanel1 = new paqstreams.EditorPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(editorPanel1, java.awt.BorderLayout.CENTER);
pack();
}
public static void main(String args[]) {
EditorMarc marco = new EditorMarc();
marco.setSize(400, 300);
marco.setTitle("Editor de Texto");
marco.setVisible(true);
}
private paqstreams.EditorPanel editorPanel1;
} |
Ampliación de la utilidad UtilEntradaSalida
Para que nuestro editor de texto pueda leer y guardar ficheros de texto, vamos a añadir los métodos cargarFichero(...) y guardarFichero(...) a la Clase UtilEntradaSalida
package paqstreams;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileReader;
import java.io.FileWriter;
import javax.swing.JTextArea;
public class UtilEntradaSalida {
public static void copiaFicheroBytes(String fich1, String fich2)
throws FileNotFoundException, IOException {
File fInput = new File(fich1);
File fOutput = new File(fich2);
FileInputStream fileInputStream = new FileInputStream(fInput);
FileOutputStream fileOutputStream = new FileOutputStream(fOutput);
int c;
while ((c = fileInputStream.read()) != -1)
fileOutputStream.write(c);
fileInputStream.close();
fileOutputStream.close();
}
public static void cargarFichero
(File
fileIn, JTextArea
textArea1) throws
IOException
{
if (fileIn == null) return;
FileReader fileReaderIn = new FileReader(fileIn);
int iTamaño = (int) fileIn.length();
char[] mCaracteres = new char[iTamaño];
fileReaderIn.read(mCaracteres, 0, iTamaño);
textArea1.setText(new String(mCaracteres));
fileReaderIn.close();
}
public static void guardarFichero(File fileOut, JTextArea textArea1) throws IOException {
if (fileOut == null) return;
FileWriter fileWriterOut = new FileWriter(fileOut);
String strTexto = textArea1.getText();
fileWriterOut.write(strTexto);
fileWriterOut.close();
}
} |
- public static void cargarFichero(File fileIn, JTextArea textArea1) throws IOException {
- este método carga el fichero seleccionado en un área de texto
- FileReader fileReaderIn = new FileReader(fileIn);
- creamos un stream de entrada basado en el fileIn para poder leer su contenido.
- como estamos leyendo texto utilizamos la clase FileReader en vez de de la Clase FileInputStream.
- int iTamaño = (int) fileIn.length();
- cogemos el tamaño del fichero
- char[] mCaracteres = new char[iTamaño];
- los caracteres leídos se guardan en una Matriz de Caracteres apuntada por la variable de referencia mCaracteres
- fileReaderIn.read(mCaracteres, 0, iTamaño);
- mCaracters: buffer de destino
- 0: Punto en el fichero desde donde se empiezan a leer los caracteres
- iTamaño: Máximo número de caracteres que queremos leer.
- textArea1.setText(new String(mCaracteres));
- muestra los caracteres del fichero en el Area de Texto
- fileReaderIn.close();
- cerramos el stream de entrada
- public static void guardarFichero(File fileOut, JTextArea textArea1) throws IOException {
- este método guarda el fichero seleccionado en un area de texto
- FileWriter fileWriterOut = new FileWriter(fileOut);
- ahora creamos un stream de salida basado en el fileOut para poder escribir dentro de él.
- como estamos leyendo texto utilizamos la Clase FileWriter en vez de FileOutputStream.
- String strTexto = textArea1.getText();
- depositamos el contenido del area de texto en un String
- fileWriterOut.write(strTexto);
- escribimos en stream de salida el contenido del String
- fileWriterOut.close();