Keypad
Keypad é uma janela (Window) com um teclado numérico que se ancora acima ou abaixo do campo de texto em foco. Quando em modo calculadora (isCalculator), acrescenta uma 4ª coluna com + − × ÷ = e resolve a aritmética digitada, escrevendo o resultado de volta no campo.
O uso é quase sempre indireto: você configura Keyboard.KEYPAD/CALCULATOR (ou EditMode.CURRENCY) no TextField e o próprio campo instancia e exibe o Keypad quando ganha foco. Instanciá-lo manualmente é raro.
🔴 · Pacote:
dev.crossfly.ui· Estende:Window· Estilo:KeypadStyle
Quando usar
- Entrada numérica embutida (sem depender do teclado nativo), inclusive no desktop.
- Modo calculadora: permitir que o usuário faça contas dentro de um campo monetário/numérico.
Quando NÃO usar
- Entrada de texto livre → deixe o teclado nativo (
Keyboard.DEFAULT). - Você raramente instancia
Keypaddiretamente — configure o teclado noTextField.
Aparência
Grade de botões (GridLayout): 3 colunas (0–9, backspace, enter) ou 4 colunas em modo calculadora (com operadores). Os botões usam keyWidth/keyHeight (× altura da fonte) e cantos arredondados nas quatro pontas. A janela posiciona-se abaixo do campo se couber, senão acima (ciente do caption flutuante).
``
Exemplo completo (copiar, colar e rodar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
// Campo numérico que receberá as teclas do Keypad
TextField valor = new TextField().caption("Quantidade");
add(LAY_AUTO, valor);
// Label de saída
Label saida = new Label("Digite no keypad e toque em Confirmar");
add(LAY_AUTO, saida);
// Botão que abre o Keypad ancorado ao campo (uso direto)
Button abrir = new Button("Abrir keypad").onAction(c -> {
Keypad kp = new Keypad(valor); // target é o TextField acima
kp.show();
});
add(LAY_AUTO, abrir);
// O Keypad escreve no campo; leia getText() no envio
Button confirmar = new Button("Confirmar")
.onAction(c -> saida.setText("Valor: " + valor.getText()));
add(LAY_AUTO, confirmar);
}
}
Os trechos abaixo mostram só o miolo (o que vai dentro de
onShow()). Para rodar, coloque-os no esqueletoMainWindowacima.
Uso básico (indireto, via TextField)
// O TextField exibe o Keypad sozinho ao focar:
TextField valor = new TextField().caption("Quantidade");
valor.setKeyboard(Keyboard.KEYPAD); // teclado numérico embutido
container.add(LAY_AUTO, valor);
// Modo calculadora — CURRENCY já usa CALCULATOR por padrão:
TextField preco = new TextField().caption("Preço");
preco.setMode(EditMode.CURRENCY, true);
container.add(LAY_AUTO, preco);
Uso direto (avançado)
// Ancorar manualmente um Keypad a um campo:
Keypad kp = new Keypad(campo); // campo é um TextInput (TextField/TextArea)
kp.show();
// Em modo calculadora:
Keypad calc = new Keypad(campo);
calc.<KeypadStyle>getStyle().isCalculator(true);
calc.show();
Construtores
| Construtor | Descrição |
|---|---|
Keypad(TextInput target) |
cria o keypad ancorado ao campo target que receberá as teclas |
Propriedades e personalização (via KeypadStyle)
| Propriedade | Tipo | O que faz |
|---|---|---|
.isCalculator(boolean) |
boolean |
4ª coluna com + − × ÷ e botão = |
.is1to9(boolean) |
boolean |
ordem das teclas (1-2-3 no topo vs 7-8-9) |
.keyWidth / .keyHeight |
float |
tamanho das teclas (× altura da fonte) |
.digitColor / .specialColor |
ARGB | cor dos dígitos / teclas especiais |
.keypadBackColor |
ARGB | fundo das teclas |
.enterIcon / .backspaceIcon |
Icon |
ícones de enter e backspace |
.radiusTL/TR/BL/BR |
float |
raios de canto |
Callbacks e eventos
Keypad não expõe onAction próprio. Ele envia as teclas ao target:
- Dígitos →
target.onKeyTyped(c). - Backspace / Enter →
target.onKeyDown(Input.Keys.BACKSPACE / ENTER). - Em modo calculadora,
=calcula e escreve o resultado viatarget.setText(...). - Ao fechar (
onRemove), o foco volta ao campo comrestoreFocusAtEnd().
Para reagir, observe o campo (getText()), não o Keypad.
Estados
- Enter ↔ Equals: em modo calculadora, o botão inferior alterna entre
Enter(ícone) e=(texto) conforme há operação pendente. - A janela fecha ao tocar fora ou ao confirmar (
Enter).
Campo monetário com calculadora embutida
TextField total = new TextField().caption("Total");
total.setMode(EditMode.CURRENCY, true); // abre o Keypad em modo calculadora
container.add(LAY_AUTO, total);
// O usuário digita "10 + 5 =" e o campo passa a mostrar 15,00.
Forçar o Keypad no desktop
// NUMERIC no desktop cai para KEYPAD automaticamente em showInput();
// para garantir o Keypad em qualquer plataforma, use KEYPAD explicitamente:
TextField codigo = new TextField().caption("Código");
codigo.setKeyboard(Keyboard.KEYPAD);
container.add(LAY_AUTO, codigo);
Boas práticas
- Prefira configurar o teclado no
TextField(setKeyboard/setMode) a instanciarKeypaddiretamente. - Para entrada monetária,
EditMode.CURRENCYjá traz a calculadora — não é preciso configurar nada além.
Erros comuns
- Registrar
onActionnoKeypad: ele não dispara ação própria; observe o campo alvo. - Instanciar
Keypadsem umtargetfocável: ele precisa de umTextInputpara enviar as teclas.