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

Como criar um campo de moeda

Propósito. Criar um campo que formata valores monetários da direita para a esquerda (o usuário digita 12345 e vê 123,45), com agrupamento de milhar e casas decimais conforme o locale, e recuperar o valor como número decimal para cálculo.

APIs usadas

  • campo.setMode(EditMode.CURRENCY, true) — liga o modo moeda com maskedEdit. Deriva automaticamente: validChars = "0123456789.+-", textAlignment = END (alinhado à direita), keyboard = CALCULATOR e, se não houver máscara, mask = TextField.getDefaultCurrencyMask(decimalPlaces).
  • campo.<TextFieldStyle>getStyle().decimalPlaces(2) — número de casas decimais (padrão 2). Defina antes de setMode, pois a máscara padrão é montada a partir dele.
  • TextField.getDefaultCurrencyMask(int decimalPlaces) — gera a máscara padrão usando LocaleFormats.thousandsSeparator e LocaleFormats.decimalSeparator (ex.: 999.999.999,99 em pt-BR).
  • TextField.getText() — valor formatado para exibir ("1.234,56").
  • TextField.getTextWithoutMask() — valor com ponto decimal, pronto para Double.parseDouble ("1234.56"). Respeita o sinal negativo.

Sinal negativo: em modo moeda com máscara, digitar - ou + alterna o sinal sem inserir caractere (handleCharInput). O negativo aparece em getTextWithoutMask() como prefixo -.

Separadores vêm do locale via LocaleFormats (preenchido na inicialização). Não fixe ,/. no código — use getDefaultCurrencyMask ou setMode(CURRENCY, true) para respeitar a região.

Exemplo completo (copiar, colar e rodar)

package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*;   // TextFieldStyle (config no estilo)

/** 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());

      TextField valor = new TextField("");
      valor.caption("Valor");
      valor.<TextFieldStyle>getStyle().decimalPlaces(2); // defina antes de setMode
      valor.setMode(EditMode.CURRENCY, true);            // moeda + máscara + teclado calculadora
      valor.setText("1234.56");                          // exibe "1.234,56" (pt-BR)

      Label resultado = new Label("");

      Button somar = new Button("Somar 10");
      somar.onAction(o ->
      {
         double v = Double.parseDouble(valor.getTextWithoutMask()); // 1234.56
         double total = v + 10;
         resultado.setText("Total: " + total);
      });

      add(LAY_FILL, valor);
      add(LAY_AUTO, somar);
      add(LAY_FILL, resultado);
   }
}

O trecho abaixo mostra só o miolo. Para rodar, coloque-o no esqueleto MainWindow acima.

Trecho mínimo

import dev.crossfly.ui.*;
import dev.crossfly.ui.style.*;
import static dev.crossfly.ui.UIConstants.EditMode;

TextField valor = new TextField("");
valor.caption("Valor");
valor.<TextFieldStyle>getStyle().decimalPlaces(2); // defina antes de setMode
valor.setMode(EditMode.CURRENCY, true);            // moeda + máscara + teclado calculadora

// valor inicial:
valor.setText("1234.56"); // exibe "1.234,56" (pt-BR)

Button somar = new Button("Somar");
somar.onAction(o ->
{
   double v = Double.parseDouble(valor.getTextWithoutMask()); // 1234.56
   // ... cálculo
});

Para uma máscara customizada (ex.: 3 casas decimais explícitas):

valor.<TextFieldStyle>getStyle()
   .mask(TextField.getDefaultCurrencyMask(3)); // depois setMode(CURRENCY, true)

Aprofunde-se

Esta página foi útil?