# Manejando la entrada

> onAction vs onActionThread, foco, TextField/TextArea y los handlers de toque/gesto.

Source: https://crossfly.dev/es/docs/learn/handling-input — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# 6. Manejando la entrada

> **Lo que vas a aprender:** reaccionar a toques, teclas y gestos, y leer la entrada de texto.
> **Prerrequisitos:** [Estilos y temas](/docs/learn/styling-and-themes).

## Ejemplo completo (copiar, pegar y ejecutar)
Formulario de agregar tarea: campo + botón con validación, lectura del texto al enviar y feedback con
`Hint`. Agrega las tareas a un `Label` de salida. Compila tal cual.
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

public class MainWindow extends Window
{
   private final TextField campo = new TextField().caption("Nova tarefa");
   private final Label saida = new Label("Nenhuma tarefa ainda");

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      add(LAY_AUTO, campo);

      Button add = new Button("Adicionar");
      add.onAction(c -> {                                 // corre en el paint thread
         String texto = campo.getText().trim();
         if (texto.isEmpty()) { Hint.show("Digite algo", 2000); return; }   // validación (2 args)
         adicionarTarefa(texto);
         campo.clearText();
      });
      add(LAY_AUTO, add);

      add(LAY_AUTO, saida);
   }

   private void adicionarTarefa(String texto)
   {
      saida.setText("Adicionada: " + texto);
      saida.repaint();
   }
}
```
> Los fragmentos de abajo muestran **solo el núcleo** (lo que va dentro de `onShow()`). Para ejecutar, colócalos en el esqueleto `MainWindow` de arriba.

## `onAction` vs `onActionThread`
```java
botao.onAction(c -> salvar());          // corre en el paint thread (rápido, toca la UI)
botao.onActionThread(c -> {             // corre en hilo de fondo (trabajo pesado)
   var dados = baixar();
   c.onUI(() -> mostrar(dados));         // vuelve a la UI
});
```

## Entrada de texto — lee al enviar
No hay evento por tecla: lee `getText()` cuando lo necesites (ej.: en el botón).
```java
TextField campo = new TextField().caption("Nova tarefa");
Button add = new Button("Adicionar");
add.onAction(c -> {
   String texto = campo.getText().trim();
   if (texto.isEmpty()) { Hint.show("Digite algo", 2000); return; }   // validación
   adicionarTarefa(texto);
   campo.clearText();
});
```
Foco: sobrescribe `onFocus()`/`onBlur()` en una subclase cuando necesites reaccionar a la ganancia/pérdida de foco.

## Gestos de toque (sobrescribibles)
En un componente custom, sobrescribe los handlers para gestos:
```java
@Override public void onLongTouch(float x, float y) throws Exception { abrirDetalhe(); }
// también: onTouchDown/onTouchUp/onPan
```
> Las excepciones en callbacks van a `Debug.handle` (no borbotean para derribar el frame).

## Construyes en este paso
El **formulario de agregar tarea** (campo + botón + validación) y el **gesto** de abrir el detalle.

## Recapitulando
`onAction` (UI) / `onActionThread` (fondo); lee texto con `getText()` al enviar; gestos por handlers
sobrescribibles; los errores van a `Debug.handle`.

## Próximos pasos
→ [Gestionando el estado](/docs/learn/managing-state)

## Ver también
- [Formularios y entrada (ui)](/docs/ui/forms-and-input) · Fuente canónica: Capítulo 6 · Capítulo 14
