# Lidando com entrada

> onAction vs onActionThread, foco, TextField/TextArea e os handlers de toque/gesto.

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

# 6. Lidando com entrada

> **O que você vai aprender:** reagir a toques, teclas e gestos, e ler a entrada de texto.
> **Pré-requisitos:** [Estilos e temas](/docs/learn/styling-and-themes).

## Exemplo completo (copiar, colar e rodar)
Formulário de adicionar tarefa: campo + botão com validação, leitura do texto no envio e feedback com
`Hint`. Adiciona as tarefas a um `Label` de saída. Compila como está.
```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 -> {                                 // roda na paint thread
         String texto = campo.getText().trim();
         if (texto.isEmpty()) { Hint.show("Digite algo", 2000); return; }   // validação (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();
   }
}
```
> Os trechos abaixo mostram **só o miolo** (o que vai dentro de `onShow()`). Para rodar, coloque-os no esqueleto `MainWindow` acima.

## `onAction` vs `onActionThread`
```java
botao.onAction(c -> salvar());          // roda na paint thread (rápido, toca a UI)
botao.onActionThread(c -> {             // roda em thread de fundo (trabalho pesado)
   var dados = baixar();
   c.onUI(() -> mostrar(dados));         // volta à UI
});
```

## Entrada de texto — leia no envio
Não há evento por tecla: leia `getText()` quando precisar (ex.: no botão).
```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; }   // validação
   adicionarTarefa(texto);
   campo.clearText();
});
```
Foco: sobrescreva `onFocus()`/`onBlur()` numa subclasse quando precisar reagir ao ganho/perda de foco.

## Gestos de toque (sobrescrevíveis)
Em um componente custom, sobrescreva os handlers para gestos:
```java
@Override public void onLongTouch(float x, float y) throws Exception { abrirDetalhe(); }
// também: onTouchDown/onTouchUp/onPan
```
> Exceções em callbacks vão para `Debug.handle` (não borbulham para derrubar o frame).

## Constrói neste passo
O **formulário de adicionar tarefa** (campo + botão + validação) e o **gesto** de abrir o detalhe.

## Recapitulando
`onAction` (UI) / `onActionThread` (fundo); leia texto com `getText()` no envio; gestos por handlers
sobrescrevíveis; erros vão ao `Debug.handle`.

## Próximos passos
→ [Gerenciando estado](/docs/learn/managing-state)

## Veja também
- [Formulários e entrada (ui)](/docs/ui/forms-and-input) · Fonte canônica: Capítulo 6 · Capítulo 14
