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.
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á.
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 esqueletoMainWindowacima.
onAction vs onActionThread
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).
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:
@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
Veja também
- Formulários e entrada (ui) · Fonte canônica: Capítulo 6 · Capítulo 14