JTextArea para texto multilínea en Java

JTextArea en Java para campos de texto multi-línea en contraposición a JTextField

JTextField es un componente que muestra una sola línea de texto, en cambio JTextArea muestra múltiples líneas de texto. Ambos componentes muestran todo su texto en el mismo formato (fuente, color…), sin embargo, es factible modificar esos dos parámetos y no usar los que Java implementa por defecto.

Para crear un objeto JTextArea se pueden emplear varios constructores:

TextArea texto = new JTextArea(); //sin parámetros
JTextArea texto = new JTextArea(10,40); //número de filas y columnas
JTextArea texto = new JTextArea( "Texto dentro de JTextArea" ); //cadena de texto

Si se desea que JTextArea implemente barras de deslizamiento (scroll) ha de estar contenida en un objeto JScrollPane cuyo primer parámetro es el objeto contenido y los otros dos parámetos se refieren a las barras de scroll:

JScrollPane pScroll = new JScrollPane(texto,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

Y este objeto JScrollPane es el que debe ser añadido al panel contenedor, y no la propia JTextArea, de no ser así, las barras de scroll no funcionarán adecadamente:

JScrollPane pScroll = new JScrollPane(texto,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

JTextArea puede ser editada por el usuario o puede ser de sólo lectura, dependiendo de la propiedad setEditable():

texto.setEditable(false); //sólo lectura

En este ejercicio se van añadiendo líneas desde JTextField a JTextArea al pulsar un botón, y otro botón limpia el área de texto.

Método que añade líneas desde JTextField a JTextArea

Obtiene en primer lugar la cadena de texto de JTextField, utiliza un entero orden para poner un tope al número de líneas que se pueden escribir en JTextArea y numerar las líneas que se van añadiendo y recurre al método append() de TextArea para añadir nuevas líneas (texto1 es JTextField y texto2 es JTextArea):

// CLASE QUE AÑADE LÍNEAS DESDE JTEXTFIELD A TEXTAREA
class ponerTexto implements ActionListener {
public void actionPerformed(ActionEvent evt) {
String texto = texto1.getText();
/* 16 líneas como máximo, mostrando al principio el número de línea
* mostrar un cero antes del número de línea hasta llegar a 10 *
if (orden < 16)
{ if (orden > 9)
{
texto2.append("0" + (orden+1) + " - " + texto + newline); }
else if (orden < 9)
{ texto2.append((orden+1) + " - " + texto + newline); }
// posicionarse siempre en la última línea de JTExtArea
texto2.setCaretPosition(texto2.getDocument().getLength());
orden++; }
else {
texto1.setFont(new java.awt.Font("Arial", Font.BOLD, 12));
F2 = new Color(255,0,0);
texto1.setForeground(F2);
texto1.setText("No se pueden añadir más de 16 líneas."); }
}
}


Método que limpia de texto JTextArea

Es muy simple, vacía el área de texto e inicializa a cero la variable orden que cuenta las líneas añadidas a JTextArea:

class limpiarTexto implements ActionListener {
public void actionPerformed(ActionEvent evt) {
texto1.setFont(new java.awt.Font("Arial", Font.PLAIN, 12));
F3 = new Color(0,0,0);
texto1.setForeground(F3);
texto1.setText(texto1Inicio);
texto2.setText("");
orden=0;
}
}


Código completo del programa

/*COMPONENTES JTEXTFIELD Y TEXTAREA CON EVENTOS PARA
* - AÑADIR LINEAS DESDE JTEXTFIELD A TEXTAREA
* - LIMPIAR DE TEXTO A TEXTAREA
* - SALIR DEL PROGRAMA 
* (Miliuco agosto 2005) */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.Color;

// CLASE PRINCIPAL DEL PROGRAMA
public class Campos_de_Texto extends JFrame {

	// variables a nivel de clase
    protected JTextField texto1;
    protected JTextArea texto2;
	protected JPanel p1, p2;
	protected JButton btPoner, btQuitar, btSalir;
	protected String texto1Inicio;
	protected Color B, F1, F2, F3;
	protected int orden;
	// constante para el salto de linea
    protected final static String newline = "\n";

	// METODO CONSTRUCTOR QUE CREA Y MUESTRA LA INTERFAZ
		public Campos_de_Texto() {

		/* la variable especial super refiere a la superclase de la clase actual,
		* la clase Campos_de_Texto hereda de JFrame por ello
		* super es JFrame, se declara un JFrame con el constructor
		* que pasa como argumento un String para el titulo,
		* super ha de ir siempre en la primera linea del metodo */
		super("JTextArea");
		/* la linea anterior equivale a this.setTitle("JTextArea");
		* cualquiera de las dos sirve para mostrar el texto
		* en la barra de titulo de la ventana */

		/* la variable especial this se usa en metodos de instancia
		* para hacer referencia al objeto que contiene al metodo,
		* aquí equivale a JFrame */

		// accion por defecto al cerrar la ventana: salir del programa
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// paneles de disposicion
		p1 = new JPanel(new BorderLayout()); // panel principal
		p2 = new JPanel(new GridLayout(1,3)); // panel para 3 botones en BorderLayout.SOUTH
		p1.setBorder(BorderFactory.createEmptyBorder(6,6,6,6));

		// campo de texto JTextField
		texto1 = new JTextField(40);
		texto1.setFont(new java.awt.Font("Tahoma", Font.PLAIN, 12));
		texto1Inicio = "\"CopiarTexto\" copia una linea. \"Limpiar texto\" borra todo el texto.";
		texto1.setText(texto1Inicio);

		// campo de texto JTextArea
		texto2 = new JTextArea(10,40);
		texto2.setEditable(false);
		texto2.setFont(new java.awt.Font("Tahoma", Font.PLAIN, 12));
		B = new Color(200,200,200);
		texto2.setBackground(B);
		F1 = new Color(0,0,0);
		texto2.setForeground(F1);
		JScrollPane pScroll = new JScrollPane(texto2, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

		btPoner = new JButton("Copiar texto");
		btQuitar = new JButton("Limpiar texto");
		btSalir = new JButton("Salir");

		// asociar los botones con instancias de las clases que definen las acciones
		btPoner.addActionListener(new ponerTexto());
		btQuitar.addActionListener(new limpiarTexto());
		btSalir.addActionListener(new cerrarVentana());

		/*colocar los componentes en los paneles;
		* para añadir un componente a un JFrame es preferible
		* frame.getContentPane().add(panel);
		* en lugar de
		* frame.add(panel);*/
		this.getContentPane().add(p1);
		p1.add(texto1, BorderLayout.NORTH);
		// añadir JScrollPane al panel principal en lugar de añadir directamente JTextArea
		// para implementar las barras de deslizamiento (scroll)
		p1.add(pScroll, BorderLayout.CENTER);
		p1.add(p2,BorderLayout.SOUTH);
		p2.add(btPoner);
		p2.add(btQuitar);
		p2.add(btSalir);

		// tooltips para algunos elementos de la interfaz grafica
		btPoner.setToolTipText("Copiar texto desde JTextField a JTextArea");
		btQuitar.setToolTipText("Limpiar de texto JTextArea");
		btSalir.setToolTipText("Salir de la aplicación");

		// crear y mostrar la ventana centrada en la pantalla
		// this.setTitle("JTextArea");
		this.setResizable(false);
		this.pack();
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}

// METODO DE ENTRADA AL PROGRAMA
public static void main(String[] args) {
	  	// Java look and feel
    	JFrame.setDefaultLookAndFeelDecorated(true);
		// instancia de la clase principal
		new Campos_de_Texto();
	}

  // CLASE QUE AÑADE LÍNEAS DESDE JTEXTFIELD A TEXTAREA
  class ponerTexto implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
		String texto = texto1.getText();
			/* 16 líneas como maximo, mostrando al principio el numero de linea
			* mostrar un cero antes del numero de linea hasta llegar a 10 */
			if (orden<16) {
				if (orden<9) {
					texto2.append("0" + (orden+1) + " - " + texto + newline); }
				else if (orden>=9)
					{ texto2.append((orden+1) + " - " + texto + newline); }
			// posicionarse siempre en la ultima linea de JTExtArea
			texto2.setCaretPosition(texto2.getDocument().getLength());
			orden++; }
			else { 
				texto1.setFont(new java.awt.Font("Tahoma", Font.BOLD, 12));
				F2 = new Color(255,0,0);
				texto1.setForeground(F2);
				texto1.setText("No puede haber mas de 16 lineas..."); }
		}
	}

  // CLASE QUE VACIA TEXTAREA
  class limpiarTexto implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
		texto1.setFont(new java.awt.Font("Tahoma", Font.PLAIN, 12));
		F3 = new Color(0,0,0);
		texto1.setForeground(F3);
		texto1.setText(texto1Inicio);
		texto2.setText("");
		orden=0;}
	}

  // CLASE QUE SALE DEL PROGRAMA
  class cerrarVentana implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
		System.exit(0);}
	}

}