Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
Cómo crear un campo de moneda
Propósito. Crear un campo que formatea valores monetarios de derecha a izquierda (el usuario escribe 12345 y ve 123,45), con agrupación de miles y decimales según el locale, y recuperar el valor como número decimal para el cálculo.
APIs usadas
campo.setMode(EditMode.CURRENCY, true)— activa el modo moneda conmaskedEdit. Deriva automáticamente:validChars = "0123456789.+-",textAlignment = END(alineado a la derecha),keyboard = CALCULATORy, si no hay máscara,mask = TextField.getDefaultCurrencyMask(decimalPlaces).campo.<TextFieldStyle>getStyle().decimalPlaces(2)— número de decimales (por defecto2). Define antes desetMode, ya que la máscara por defecto se construye a partir de él.TextField.getDefaultCurrencyMask(int decimalPlaces)— genera la máscara por defecto usandoLocaleFormats.thousandsSeparatoryLocaleFormats.decimalSeparator(ej.:999.999.999,99en pt-BR).TextField.getText()— valor formateado para mostrar ("1.234,56").TextField.getTextWithoutMask()— valor con punto decimal, listo paraDouble.parseDouble("1234.56"). Respeta el signo negativo.
Signo negativo: en modo moneda con máscara, escribir
-o+alterna el signo sin insertar carácter (handleCharInput). El negativo aparece engetTextWithoutMask()como prefijo-.
Los separadores vienen del locale vía
LocaleFormats(rellenado en la inicialización). No fijes,/.en el código — usagetDefaultCurrencyMaskosetMode(CURRENCY, true)para respetar la región.
Ejemplo completo (copiar, pegar y ejecutar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*; // TextFieldStyle (config en el estilo)
/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: 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); // define antes de setMode
valor.setMode(EditMode.CURRENCY, true); // moneda + máscara + teclado calculadora
valor.setText("1234.56"); // muestra "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);
}
}
El fragmento de abajo muestra solo el núcleo. Para ejecutarlo, colócalo en el esqueleto
MainWindowde arriba.
Fragmento 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); // define antes de setMode
valor.setMode(EditMode.CURRENCY, true); // moneda + máscara + teclado calculadora
// valor inicial:
valor.setText("1234.56"); // muestra "1.234,56" (pt-BR)
Button somar = new Button("Somar");
somar.onAction(o ->
{
double v = Double.parseDouble(valor.getTextWithoutMask()); // 1234.56
// ... cálculo
});
Para una máscara personalizada (ej.: 3 decimales explícitos):
valor.<TextFieldStyle>getStyle()
.mask(TextField.getDefaultCurrencyMask(3)); // después setMode(CURRENCY, true)
Profundiza
- Máscaras y teclados · Campos de texto
- Recetas hermanas: Máscara de CPF/CEP/fecha · Teclado numérico
- Fuente canónica: Capítulo 14 — Widgets básicos · Enums (UIConstants)