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 commaskedEdit. Deriva automaticamente:validChars = "0123456789.+-",textAlignment = END(alinhado à direita),keyboard = CALCULATORe, se não houver máscara,mask = TextField.getDefaultCurrencyMask(decimalPlaces).campo.<TextFieldStyle>getStyle().decimalPlaces(2)— número de casas decimais (padrão2). Defina antes desetMode, pois a máscara padrão é montada a partir dele.TextField.getDefaultCurrencyMask(int decimalPlaces)— gera a máscara padrão usandoLocaleFormats.thousandsSeparatoreLocaleFormats.decimalSeparator(ex.:999.999.999,99em pt-BR).TextField.getText()— valor formatado para exibir ("1.234,56").TextField.getTextWithoutMask()— valor com ponto decimal, pronto paraDouble.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 emgetTextWithoutMask()como prefixo-.
Separadores vêm do locale via
LocaleFormats(preenchido na inicialização). Não fixe,/.no código — usegetDefaultCurrencyMaskousetMode(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
MainWindowacima.
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
- Máscaras e teclados · Campos de texto
- Receitas irmãs: Máscara de CPF/CEP/data · Teclado numérico
- Fonte canônica: Capítulo 14 — Widgets básicos · Enums (UIConstants)
Esta página foi útil?Obrigado pelo feedback!