Home | Clases | Interfaces de usuario con Java Swing | Componentes: JEditorPane y JTextPane

Componentes: JEditorPane y JTextPane


Introducción

En java hasta ahora hemos visto varios componentes visuales que nos permiten escribir texto o pedírselo al usuario, pero hay algunos más y cada uno es adecuado para una finalidad diferente:

  • JTextField: Un campo de texto que permite pedir/mostrar una sola línea de texto. No admite mezclar fuentes de texto, colores ni nada parecido. Es adecuado para pedir, por ejemplo, un nombre, un teléfono, etc.
  • JFormattedTextField. Como el anterior, pero más avanzado. Permite pedir datos, de una sola línea, que cumplan unas ciertas restricciones o un cierto formato. Es adecuado para pedir fechas, horas, direcciones IP, etc. Incluso para pedir datos numéricos si queremos controlar que no se puedan escribir letras.
  • JPasswordField: Este sirve para pedir una password. Sólo pinta asteriscos.
  • JTextArea. Este ya admite varias líneas de texto, pero es un editor simple. No admite mezclar fuentes de letra, cursivas, imágenes, etc. Todo el texto, en varias líneas, pero con una única fuente de letra.
  • JEditorPane. Este es más complejo que el anterior y admite texto con cierto formato. Admite texto plano, HTML y RTF por defecto, aunque podríamos ampliarlo. Este sí permite mezclar fuentes, colores e imágenes.
  • JTextPane. Este es el más complejo de todos. Admite lo mismo que el anterior, pero además permite que vayamos añadiendo texto cada uno con sus propios atributos de texto (fuentes, colores, etc.). Admite también directamente iconos de la clase Icon de java e incluso cualquier componente de Java, como JButton, etc.


Vamos a centrarnos en este capítulo en JEditorPane y JTextPane.

JEditorPane

El JEditorPane admite texto con cierto formato. Por defecto conoce el text/plain, text/html y text/rtf, aunque debemos decirle a priori qué es lo que va a usar.

El tipo text/plain es el tipo por defecto, así que si no indicamos nada, es el que se usará.

Si queremos construir otros formatos, debemos heredar de javax.swing.text.EditorKit y construirnos una clase definiendo todos los métodos abstractos, aunque aquí no lo vamos a hacer.

Para los formatos que java entiende, java nos proporciona clases que heredan de EditorKit y saben tratar los tipos de texto mencionados, pero el JEditorPane las maneja internamente y no nos enteraremos de su existencia, pero que sepas que son DefaultEditorKit, HTMLEditorKit y RTFEditorKit.

Y para aclararlo todo, vamos a ver un ejemplo de JEditorPane utilizando HTML:


package editorpane;

import java.net.URL;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;

public class EditorPane extends JFrame{

JEditorPane editor = new JEditorPane();

public EditorPane(){

URL url = getClass().getResource("/img/smiley.png");

setLayout(null); //Layout absoluto

JEditorPane editor = new JEditorPane(); //Incilaizamos el editorPane
editor.setContentType("text/html"); // Marcamos el editor para que use HTML

// Insertamos un trozo de HTML
editor.setText(
"<b>hola</b><br>" +
"<i>adios</i>
" +
"<font face='arial'>fuente arial</font><br>" +
"<font face='courier'>fuente courier</font><br>" +
"<font size='24'>fuente grande</font><br>" +
"<font color='red'>color rojo</font><br>" +
"<img src=" + url + " width=250 height=250></img>"
);

//Si sólo queremos mostrar texto HTML, debemos deshabilitar la edición del editor
editor.setEditable(false);

//Incializamos el scrollPane y le añadimos el editor
JScrollPane scrollPane = new JScrollPane(editor);
scrollPane.setBounds(50,50,300,300);
add(scrollPane);

}

public static void main(String[] args) {

EditorPane formulario =new EditorPane();
formulario.setDefaultCloseOperation(EXIT_ON_CLOSE);
formulario.setBounds(0,0,400,400);
formulario.setTitle("Ejemplo JEditorPane");
formulario.setVisible(true);

}

}


JTextPane

JTextPane es otro editor que admite colores, fuentes, tamaños, etc. Admite incluso que el pongamos directamente iconos pasándole una clase Icon de java o que le añadamos un componente de java como JButton, JLabel, etc.

Para añadir texto, debemos ir añadiéndolo indicando en cada caso que "atributos" queremos para ese texto. Si lo queremos en negrita, con cierta fuente de letra, tamaño, color, etc.

El problema es que JTextPane no tiene métodos para ir añadiendo poco a poco el texto. Simplemente tienen un método setText() al que se pasa todo el texto de golpe. Para poder trabajar con el JTextPane, debemos pedirle el Document asociado con getDocument() y trabajar con él, que sí tiene métodos para ir añadiendo texto poco a poco.

Por ejemplo, para añadir un trozo de texto en negrita, otro de color rojo, un icono y un botón, haríamos lo siguiente:


package textpane;

import java.awt.Color;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class TextPane extends JFrame{

JTextPane text = new JTextPane();

public TextPane(){

URL imagen = getClass().getResource("/img/smileyicon.png");

JTextPane text = new JTextPane(); //Incializamos el textPane
setLayout(null); //Layout absoluto

/*Instanciamos una clase SimpleAttributeSet, que guardará los atributos
para un determinado texto: si es negrita, cursiva, fuente, etc.
*/
SimpleAttributeSet attrs = new SimpleAttributeSet();

//Texto en negrita + nueva línea
textoNegrita(attrs, text, "Esto es un texto en negrita");
nuevaLinea(text);

//Texto en rojo + nueva línea
textoRojo(attrs, text, "esto es un texto de color rojo");
nuevaLinea(text);

/*INSERTAR UN ICONO *************************************************************************
El método para ello es insertIcon(). Este método reemplaza lo que hay seleccioado en el
JTextPane por el icono. Si sólo queremos insertarlo al final, debemos cambiar la selección
del texto al final, sin seleccionar nada. Eso se hace con el método setCaretPosition().
Después generamos el icono desde la imagen y lo añadimos con insertIcon
*/
text.setCaretPosition(text.getStyledDocument().getLength());
ImageIcon icono = new ImageIcon(imagen);
text.insertIcon(icono);
nuevaLinea(text);

/*INSERTAR UN BOTÓN *************************************************************************
El método es insertComponent() y, al igual que en el caso anterior, reemplaza el texto que
haya seleccionado por el Component. Al igual que antes, con setCaretPosition() nos vamos
al final del texto e insertamos el JButton.
*/
text.setCaretPosition(text.getStyledDocument().getLength());
JButton boton = new JButton("Pulsame");
text.insertComponent(boton);
nuevaLinea(text);

//Incializamos el scrollPane y le añadimos el editor
JScrollPane scrollPane = new JScrollPane(text);
scrollPane.setBounds(50,50,300,300);
add(scrollPane);

}

//Método para texto en negrita
private void textoNegrita(SimpleAttributeSet attrs, JTextPane text, String string){

/*Para modificar el valor de estos atributos, nos ayuda la clase StyleConstants.
Esta clase tiene muchos métodos para cambiar valores a una clase SimpleAttributeSet.
En este caso concreto hemos usado setBold() para ponerlo en negrita.
*/
StyleConstants.setBold(attrs, true);

/*Obtenemos el StyledDocument, que es lo que el JTextPane tiene dentro y
representa al texto que estamos viendo.
El StyledDocument tiene un método insert() que admite tres parámetros:
- Posición en la que se quiere insetar el texto dentro del documento.
- El texto
- Los atributos del texto.
Como queremos insertar al final, la posición es justo la longitud del texto,
esto se obtiene con el método getLength().
*/
try {
text.getStyledDocument().insertString(
text.getStyledDocument().getLength(), string, attrs);
} catch (BadLocationException ex) {
Logger.getLogger(TextPane.class.getName()).log(Level.SEVERE, null, ex);
}

}

//Método para texto en rojo
private void textoRojo(SimpleAttributeSet attrs, JTextPane text, String string){

StyleConstants.setForeground(attrs, Color.red);

try {
text.getStyledDocument().insertString(
text.getStyledDocument().getLength(), string, attrs);
} catch (BadLocationException ex) {
Logger.getLogger(TextPane.class.getName()).log(Level.SEVERE, null, ex);
}

}

//Método para cambiar de línea
private void nuevaLinea(JTextPane text){

try {
text.getStyledDocument().insertString(
text.getStyledDocument().getLength(),
System.getProperty("line.separator"), null);
} catch (BadLocationException ex) {
Logger.getLogger(TextPane.class.getName()).log(Level.SEVERE, null, ex);
}

}

public static void main(String[] args) {

TextPane formulario = new TextPane();
formulario.setDefaultCloseOperation(EXIT_ON_CLOSE);
formulario.setBounds(0,0,400,400);
formulario.setTitle("Ejemplo JTextPane");
formulario.setVisible(true);

}

}



Fecha de publicación: 18/09/2020
Asignaturas: desarrollo de interfaces
Temas: interfaces usuario usabilidad
Utilizamos cookies propias y de terceros para mejorar su experiencia en la navegación. Al seguir navegando entendemos que acepta su uso.
Si lo desea, consulte nuestras políticas de privacidad y cookies
ENTENDIDO
[X] Cerrar

Contacta conmigo


[X] Cerrar

Acceso alumnos