JTextArea con texto multilínea en Java

JTextArea en Java para campos de texto con varias líneas en contraposición a JTextField que sólo admite 1 línea; añadir líneas desde JTextField a JTextArea y vaciar el campo de texto

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 el texto en el mismo formato (fuente, color…), sin embargo, es factible modificar esos parámetros en lugar de los que Java implementa por defecto.

Para crear un objeto JTextArea se pueden emplear varios constructores:

TextArea texto = new JTextArea(); //sin parametros
JTextArea texto = new JTextArea(10,40); //numero 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ámetros 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 adecuadamente:

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); //solo 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 JTextArea para añadir nuevas líneas (texto1 es JTextField y texto2 es JTextArea):

// CLASE QUE AGREGA LINEAS DESDE JTEXTFIELD A TEXTAREA
class ponerTexto implements ActionListener {
public void actionPerformed(ActionEvent evt) {
String texto = texto1.getText();
/* 16 lineas 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("Arial", Font.BOLD, 12));
		F2 = new Color(255,0,0);
		texto1.setForeground(F2);
		texto1.setText("No puede haber mas de 16 lineas."); }
	}
}


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 JTEXTAREA CON EVENTOS:
*
* - AGREGAR LINEAS DESDE JTEXTFIELD A JTEXTAREA
* - LIMPIAR JTEXTAREA
* - SALIR DEL PROGRAMA
*
* (perez987 febrero 2019) */

// import java.util.*;

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,
		* aqui 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 nueva. \"Limpiar texto\" borra todo.";
		texto1.setText(texto1Inicio);

		// campo de texto JTextArea
		texto2 = new JTextArea(17,40);
		texto2.setEditable(false);
		texto2.setFont(new java.awt.Font("Tahoma", Font.PLAIN, 12));
		B = new Color(60,60,60);
		texto2.setBackground(B);
		F1 = new Color(240,240,240);
		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 agregar 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);
		// agregar JScrollPane al panel principal en lugar de agregar 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 aplicacion");

		// crear y mostrar la ventana centrada en la pantalla
		// this.setTitle("JTextArea");
		this.setResizable(false);
		this.pack();
		this.setLocationRelativeTo(null);
		//this.setLocation(200,200);
		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 AGREGA LINEAS DESDE JTEXTFIELD A TEXTAREA
  class ponerTexto implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
		String texto = texto1.getText();
			/* 16 lineas 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.PLAIN, 12));
				F2 = new Color(255,0,0);
				texto1.setForeground(F2);
				texto1.setText("Se alcanzaron las 16 lineas (MAX)."); }
		}
	}

  // CLASE QUE LIMPIA 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);}
	}

}