如何在Swing中定义格式化文本字段,以便在键入时应用格式限制?

1 java swing number-formatting jformattedtextfield

我在JFrame上需要这样一个数字文本字段

  1. 限制小数点后两位数的输入
  2. 列出每三位数分隔的数字,即1 234 567,89.
  3. 在打字过程中,数字会以正确的格式显示

我尝试使用JFormattedTextField:

    NumberFormat nf = NumberFormat.getNumberInstance();
    nf.setMaximumFractionDigits(2);
    NumberFormatter numFormater = new NumberFormatter(nf);
    field1 = new javax.swing.JFormattedTextField(numFormater);
Run Code Online (Sandbox Code Playgroud)

但是,格式限制仅在焦点离开组件时适用,这是一个问题.我希望用户能够在字段中仅键入数字和分隔符,并在字段中输入每个3-d数字后立即放置空格分隔符.

我只能通过指定字段的属性在C#中执行此操作.什么是在Swing中做到这一点的干净方法?谢谢.

mKo*_*bel 6

  • 其中一种方法是使用InternationalFormatter其他Formatter方法Number or DecimalFormatter

  • 在每一个限制JFormattedTextField有副作用,为用户输入,例如Caret,Selection等等.

  • 适当的方法可以是组合的使用DocumentFilterDocumentListener加入到JFormattedTextField带滑动Number or DecimalFormatter,没有任何限制,所有的解决办法将被在两个设置DocumentFilter(指定为内变化Document)与DocumentListener(文档以外)

例如提到 InternationalFormatter

import java.awt.*;
import java.math.*;
import java.text.*;
import javax.swing.*;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JFormattedTextField.AbstractFormatterFactory;
import javax.swing.text.InternationalFormatter;

public class DocumentListenerAdapter {

    public DocumentListenerAdapter() {
        JFrame frame = new JFrame("AbstractTextField Test");
        final JFormattedTextField textField1 = new JFormattedTextField(new Float(10.01));
        textField1.setFormatterFactory(new AbstractFormatterFactory() {
            @Override
            public AbstractFormatter getFormatter(JFormattedTextField tf) {
                NumberFormat format = DecimalFormat.getInstance();
                format.setMinimumFractionDigits(2);
                format.setMaximumFractionDigits(2);
                format.setRoundingMode(RoundingMode.HALF_UP);
                InternationalFormatter formatter = new InternationalFormatter(format);
                formatter.setAllowsInvalid(false);
                formatter.setMinimum(0.0);
                formatter.setMaximum(1000.00);
                return formatter;
            }
        });
        NumberFormat numberFormat = NumberFormat.getNumberInstance();
        numberFormat.setMaximumFractionDigits(2);
        numberFormat.setMaximumFractionDigits(2);
        numberFormat.setRoundingMode(RoundingMode.HALF_UP);
        final JFormattedTextField textField2 = new JFormattedTextField(numberFormat);
        textField2.setValue(new Float(10.01));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(textField1, BorderLayout.NORTH);
        frame.add(textField2, BorderLayout.SOUTH);
        frame.setVisible(true);
        frame.pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new DocumentListenerAdapter();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

例如JSpinner(编辑器是JFormattedTextField),具有非常简单的DocumentFilter