Un ejemplo de uso de cada Componente de Texto

Aquí tenemos la imagen de la aplicación TextSamplerDemo:

Esta sección muestra el código usado en TextSamplerDemo para crear cada componente de texto. Con la información contenida en esta página, aprenderás rápidamente todo lo necesario para incluir componentes de texto en un programa e interactuar con ellos a un nivel básico. Para más información sobre los usos más complejos de varios componentes de texto, puedes ir a la próxima sección, Reglas Generales para usar Componentes de Texto.

Esta sección tiene cinco partes:

Un ejemplo de uso de Text Field

Aquí está el código de TextSamplerDemo que crea un JTextField y registra un oyente de action sobre él:
JTextField textField = new JTextField(10);
textField.setActionCommand(textFieldString);
textField.addActionListener(this);
Al igual que con los botones, podemos configurar el comando action de un textfield y registrar un oyente de action sobre él. Aquí está el método actionPerformed implementado por el oyente de action del textfield, que simplemente copia el texto del campo a una etiqueta.
String prefix = "You typed \"";
...
JTextField source = (JTextField)e.getSource();
actionLabel.setText(prefix + source.getText() + "\"");
Para una descripción de los constructores de JTextField y el método getText usados por esta demostración, puedes ver Cómo usar Text Fields. Esta sección también incluye información y ejemplos de campos de texto personalizados, incluyendo cómo escribir un campo validado.

Un ejemplo de uso de Password Field

JPasswordField es una subclase de JTextField que, en vez de mostrar el caracter real tecleado por el usuario, muestra otro caracter como un asterisco '*'. Este tipo de campo es útil para pedir al usuario que introduzca passwords cuando se conecta o para validar su identidad. Aquí está el código de TextSamplerDemo que crea el campo passwrod y registra un oyente de action sobre él:
JPasswordField passwordField = new JPasswordField(10);
passwordField.setActionCommand(passwordFieldString);
passwordField.addActionListener(this);
Este código es similar al usado para crear el campo de texto. El campo password comparte el oyente de action del campo de texto, que usa estas tres líneas de código para copiar el contenido del password en una etiqueta:
String prefix = "You typed \"";
...
JPasswordField source = (JPasswordField)e.getSource();
actionLabel.setText(prefix + new String(source.getPassword())
		    + "\"");
Observa que este código usa el método getPassword para obtener el contenido del campo password en lugar de getText. Proporcionar un Password Field explica porqué y proporciona información adicional sobre los campos password. Recuerda que los campos password son campos de texto, por eso la información cubierta en Cómo usar Text Fields también pertenece a los campos de password.

Usar un Text Area

Un área de texto muestra múltiples líneas de texto y permite que el usuario edite el texto con el teclado y el ratón. Aquí está el código de TextSamplerDemo que crea su JTextArea:
JTextArea textArea = new JTextArea(5, 10);
textArea.setFont(new Font("Serif", Font.ITALIC, 16));
textArea.setText(
	"This is an editable JTextArea " +
	"that has been initialized with the setText method. " +
	"A text area is a \"plain\" text component, " +
	"which means that although it can display text " +
	"in any font, all of the text is in the same font."
);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane areaScrollPane = new JScrollPane(textArea);
areaScrollPane.setVerticalScrollBarPolicy(
		JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
areaScrollPane.setPreferredSize(new Dimension(250, 250));
areaScrollPane.setBorder(/*...create border...*/);
El constructor usado en este ejemplo para crear un área de texto es similar a los usados para crear un campo de texto y un campo de password. El contructor de área de texto requiere dos argumentos enteros: el número de filas y de columnas del área. Estos números son utilizados para calcular el tamaño preferido del área de texto.

Luego el código selecciona la fuente para el área de texto seguida por el texto inicial del área. Cómo dice el texto inicial del área, aunque un área de texto puede mostrar texto en cualquier fuente, todo el texto tiene la misma fuente.

Las dos siguientes sentencias tratan de la ruptura de líneas. Primero llama a setLineWrap, que activa la ruptura de líneas. Por defecto, un área de texto no rompe las líneas. En su lugar mustra el texto en una sóla línea y si el área de texto está dentro de un scroll pane, se permite a sí mismo desplazarse horizontalmente. La segunda es una llamada a setWrapStyleWord, que le dice al área de texto que rompa la líneas entre palabras.

El siguiente grupo de código crea un scroll pane y pone el área de texto en él, selecciona el tamaño preferido del scroll pane y establece sus bordes. Normalmente un área de texto está manejada por un scroll pane. Si ponemos un área de texto en un scroll pane, debemos asegurarnos de seleccionar el tamaño preferido del scroll pane en vez del tamaño preferido del área de texto.

Usar un Editor Pane para mostrar Texto desde una URL

JEditorPane es la base para los componentes de texto formateado de Swing. TextSamplerDemo usa un editor pane como lo hacen muchos programas: para mostrar información no editable inicializada desde una URL que apunta a un fichero HTMLTextSamplerDemoHelp.html.

Aquí está el código que crea el editor pane en TextSamplerDemo:

JEditorPane editorPane = new JEditorPane();
editorPane.setEditable(false);
...create a URL object for the TextSamplerDemoHelp.html file...
try {
    editorPane.setPage(url);
} catch (IOException e) {
    System.err.println("Attempted to read a bad URL: " + url);
}
El código usa el constructor por defecto para crear el editor pane, luego llama a setEditable(false) para que el usuario no pueda editar el texto. Luego, el código crea el objeto URL, y llama al método setPage con él. El método setPage abre el recurso apuntado por la URL y se imagina el formato del texto (que en este ejemplo es HTML). Si el texto formateado es conocido, el editor pane se inicializa a sí mismo con el texto encontrado en el URL.

El código que crea la URL no está en el código anterior y es interesante verlo. Aquí está:

String s = null;
try {
    s = "file:"
	+ System.getProperty("user.dir")
	+ System.getProperty("file.separator")
	+ "TextSamplerDemoHelp.html";
    URL helpURL = new URL(s);
    /* ...  use the URL to initialize the editor pane  ... */
} catch (Exception e) {
    System.err.println("Couldn't create help URL: " + s);
}
Este código utiliza las propiedades del sistema para calcular un fichero URL desde el fichero de ayuda. Por restricciones de seguridad, este código no funcionará en la mayoría de los applets. En su lugar, utilizar el codebase del applet para calcular una URL http.

Al igual que las áreas de texto, los editor pane normalmente son manejados por un sroll pane:

JScrollPane editorScrollPane = new JScrollPane(editorPane);
editorScrollPane.setVerticalScrollBarPolicy(
		JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
editorScrollPane.setPreferredSize(new Dimension(250, 150));
Observa que se ha seleccionado el tamaño preferido del scroll pane y no el del editor pane.

Un ejemplo de uso de un Text Pane

El componente de texto final en nuestra ruta básica es JTextPane, que es una subclase de JEditorPane. Aquí está el código de TextSamplerDemo que crea e inicializa un text pane.
JTextPane textPane = new JTextPane();
String[] initString =
	{ /* ...  fill array with initial text  ... */ };

String[] initStyles =
	{ /* ...  fill array with names of styles  ... */ };

//Create the styles we need
initStylesForTextPane(textPane);

Document doc = textPane.getDocument();

//Load the text pane with styled text
try {
    for (int i=0; i < initString.length; i++) {
	textPane.setCaretPosition(doc.getLength());
	doc.insertString(doc.getLength(), initString[i],
			 textPane.getStyle(initStyles[i]));
	textPane.setLogicalStyle(textPane.getStyle(initStyles[i]));
    }
} catch (BadLocationException ble) {
    System.err.println("Couldn't insert initial text.");
}
Brevemente, esto código introduce el texto inicial en un array y crea y codifica varios estilos - objetos que representan diferentes formatos de párrafos y caracteres -- en otro array. Luego, el código hace un bucle por el array, inserta el texto en el text pane, y especifica el estilo a utilizar para el texto insertado.

Aunque esto parece un ejemplo interesante y muestra varias características de JTextPane, los programas del "mundo real" no suelen inicializar un JTextPane de esta forma. En su lugar, un programa de calidad debería aplicar un proceso de atrapamiento, donde un JTextPane básico sería utilizado para crear y salvar un documento, que podría entonces ser leido por el JTextPane mientras el programa se está desarrollando.


Ozito