Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入分组字符时,格式化JTextField输入中的光标位置不正确_Java_Swing - Fatal编程技术网

Java 插入分组字符时,格式化JTextField输入中的光标位置不正确

Java 插入分组字符时,格式化JTextField输入中的光标位置不正确,java,swing,Java,Swing,我基于JFormattedTextField编写了一个简单的类,该类应该只允许数字输入(包括浮点数)。 我正在使用DecimalFormatter来实现输入验证,因为根据我所做的研究,这显然是Swing中进行验证的必经之路。 虽然该类确实按照预期正确限制输入,但每当用户键入将导致添加分组分隔符的数字时(例如从123到1234,光标将错误地向左移动一个位置(例如:1,23 | 4,而它应该是1234).这使得用户输入数字非常困难 添加分组分隔符时,如何使光标保持在正确的位置 最小代码示例: pub

我基于
JFormattedTextField
编写了一个简单的类,该类应该只允许数字输入(包括浮点数)。 我正在使用DecimalFormatter来实现输入验证,因为根据我所做的研究,这显然是Swing中进行验证的必经之路。 虽然该类确实按照预期正确限制输入,但每当用户键入将导致添加分组分隔符的数字时(例如从
123
1234
,光标将错误地向左移动一个位置(例如:
1,23 | 4
,而它应该是
1234
).这使得用户输入数字非常困难

添加分组分隔符时,如何使光标保持在正确的位置

最小代码示例:

public class JFloatTextField extends JFormattedTextField {

public JFloatTextField() {
    this.setFormatterFactory(new AbstractFormatterFactory() {
        @Override
        public AbstractFormatter getFormatter(JFormattedTextField tf) {
            Locale locale = Locale.getDefault();
            DecimalFormatSymbols dfs = new DecimalFormatSymbols(locale);
            DecimalFormat format = (DecimalFormat) DecimalFormat.getNumberInstance(locale);
            format.setDecimalFormatSymbols(dfs);
            format.setGroupingUsed(true);
            format.setMinimumFractionDigits(2);
            format.setMaximumFractionDigits(2);
            format.setRoundingMode(RoundingMode.DOWN);
            InternationalFormatter formatter = new InternationalFormatter(format);
            formatter.setAllowsInvalid(false);
            formatter.setMinimum(0.0);
            formatter.setMaximum(Double.MAX_VALUE);
            return formatter;
        }
    });
}
}
非常感谢您的帮助