Pular para o conteúdo
CrossFly é 100% open sourceSiga no GitHub
CrossFlyCrossFly
Começar

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 Keypad diretamente — configure o teclado no TextField.

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 esqueleto MainWindow acima.

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 via target.setText(...).
  • Ao fechar (onRemove), o foco volta ao campo com restoreFocusAtEnd().

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 instanciar Keypad diretamente.
  • Para entrada monetária, EditMode.CURRENCY já traz a calculadora — não é preciso configurar nada além.

Erros comuns

  • Registrar onAction no Keypad: ele não dispara ação própria; observe o campo alvo.
  • Instanciar Keypad sem um target focável: ele precisa de um TextInput para enviar as teclas.

Veja também

Esta página foi útil?