# Áreas de texto

> TextArea — entrada de varias líneas, desplazamiento e iconos por línea.

Source: https://crossfly.dev/es/docs/ui/forms-and-input/text-areas — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Áreas de texto (`TextArea`)

`TextArea` es el campo de **varias líneas** — misma base (`TextInput`) que `TextField`, con salto de
línea, desplazamiento vertical e iconos por línea.

## Ejemplo completo (copiar, pegar y ejecutar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*;   // TextAreaStyle (config de comportamiento)

/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // Área multilínea: necesita altura explícita.
      // Aquí vía fracción de container (40% de la altura); alternativa: autoHeight en el estilo.
      TextArea obs = new TextArea().caption("Observações");
      add(0.4f, obs);

      // Etiqueta donde se mostrará el contenido leído
      Label resultado = new Label("");
      add(LAY_AUTO, resultado);

      // NO hay callback por tecla: lee getText() al enviar
      Button enviar = new Button("Enviar");
      enviar.onAction(c -> resultado.setText("Chars = " + obs.getText().length()));
      add(LAY_AUTO, enviar);
   }
}
```

> Los fragmentos siguientes muestran **solo el núcleo** (lo que va dentro de `onShow()`). Para ejecutar, colócalos en el esqueleto `MainWindow` de arriba.

## Uso básico
```java
TextArea obs = new TextArea()
   .caption("Observações")
   .text("");
painel.add(0.5f, obs);   // ocupa 50% de la altura del container (VerticalLayout)

// leer el contenido:
String texto = obs.getText();
```

## Constructores y fluent API
| Miembro | Efecto |
|---|---|
| `new TextArea()` / `new TextArea("texto")` | vacío / con valor inicial |
| `.caption(String)` | leyenda |
| `.text(String)` / `setText(String)` | define el contenido |
| `.rightIcons(Icon...)` | iconos a la derecha, uno por línea de acción |
| `.rightIconAction(int linha, Action)` | acción de un icono específico |
| `getText()` / `clearText()` | leer / limpiar |
| `scrollToTop()` · `scrollToBottom()` · `scrollToLine(int)` | desplazamiento programático |

## Dimensionar
A diferencia de `TextField` (altura de una línea), `TextArea` necesita **altura explícita** — dale una
fracción en un `VerticalLayout` o `autoHeight` en el estilo:
```java
obs.getStyle().autoHeight(Relative.ofFont(6f));   // ~6 líneas de altura
```

## Buenas prácticas
- Reserva altura suficiente (fracción de container o `autoHeight`) — de lo contrario se vuelve un campo de 1 línea.
- Usa `scrollToBottom()` al añadir texto (ej.: log/chat) para mantener la última línea visible.

## Errores comunes
- No definir altura → el área queda diminuta.
- Esperar desplazamiento horizontal — `TextArea` hace salto de línea; usa `TextField` para una línea desplazable.

## Ver también
- [Campos de texto](/docs/ui/forms-and-input/text-fields) · [Foco y validación](/docs/ui/forms-and-input/focus-and-validation)
- Catálogo: [TextArea](/docs/ui/widgets/textarea) · Referencia: Capítulo 14
