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

标签 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);

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

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

最佳答案

  • 其中一种方法是使用 InternationalFormatter,它是 Number 或 DecimalFormatter

    的附加 Formatter
  • JFormattedTextField 中的每个限制都会对用户输入产生副作用,例如插入符选择

  • 适当的方法可以是使用组合 DocumentFilterDocumentListener 添加到 JFormattedTextField 与普通 Number 或 DecimalFormatter,没有任何限制,所有解决方法都将在 DocumentFilter(指定用于 Document 内的更改)和 DocumentListener(Document 外)中设置)

例如提到的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();
            }
        });
    }
}

例如JSpinner (editor is JFormattedTextField) with very simple DocumentFilter

关于java - 如何在 Swing 中定义格式化文本字段,以便在您键入时应用格式限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20142407/

相关文章:

java - JPanel 不支持 setMinimumSize/ComponentListener

java - 为什么GC不清除Dialog引用?

Javascript date delta 与字符串之间的转换

javascript - 尾随零应该自动出现在 之前/之后。 (观点)

java - 从 ApplicationContext 获取布局充气器

Java - 可编辑组合框验证

java - 集合中的整数数组

java - 如何使用 smooks 将 xml 拆分为标题和项目?

java - JFrame 显示 - 鼠标监听器

java - 使用 '%' 将 String 转换为 double