Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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 JFormattedTextField具有严格的解析数字格式_Java_Swing_Number Formatting_Jformattedtextfield - Fatal编程技术网

Java JFormattedTextField具有严格的解析数字格式

Java JFormattedTextField具有严格的解析数字格式,java,swing,number-formatting,jformattedtextfield,Java,Swing,Number Formatting,Jformattedtextfield,由于有人错误地将我的另一个问题()标记为重复,并且没有删除重复的标签,尽管我指出它是不同的,我将再次发布该问题以及我的解决方案。也许这对某人有帮助。我们开始: 我有一个JFormattedTextField,其数字格式为Locale.US。所以小数点分隔符是点,分组分隔符是逗号 现在,我在这个文本字段中键入字符串“1,23”,并将焦点移动到另一个组件。我希望字符串消失(就像我键入“a”而不是“1,23”时那样),因为在使用Locale.US时,它显然不是数字的有效表示形式。但文本字段中的文本改为

由于有人错误地将我的另一个问题()标记为重复,并且没有删除重复的标签,尽管我指出它是不同的,我将再次发布该问题以及我的解决方案。也许这对某人有帮助。我们开始:

我有一个JFormattedTextField,其数字格式为Locale.US。所以小数点分隔符是点,分组分隔符是逗号

现在,我在这个文本字段中键入字符串“1,23”,并将焦点移动到另一个组件。我希望字符串消失(就像我键入“a”而不是“1,23”时那样),因为在使用Locale.US时,它显然不是数字的有效表示形式。但文本字段中的文本改为“123”

这是因为解析时使用的NumberFormat并不严格,只是忽略了逗号

问题:在这种情况下,如何让NumberFormat抛出ParseException,以便将焦点移动到另一个组件后文本字段将为空

测试代码:

    JDialog dialog = new JDialog();
    JPanel panel = new JPanel(new BorderLayout());
    dialog.getContentPane().add(panel);

    NumberFormat nf = NumberFormat.getInstance(Locale.US);
    JFormattedTextField textField = new JFormattedTextField(nf);
    textField.setText("1,23");
    panel.add(textField, BorderLayout.CENTER);
    panel.add(new JButton("focus"), BorderLayout.EAST);

    dialog.pack();
    dialog.setVisible(true);
将焦点从文本字段移到按钮,文本将变为“123”。

以下是我的解决方案:

首先,我创建了一个具有严格解析的自定义DecimalFormat。只允许数字和最多一个小数点

    public class StrictDecimalFormat extends DecimalFormat {

        private static final Pattern NUMBER_PATTERN = Pattern.compile("^\\d*[.]?\\d*$");

        public Number parse(String text, ParsePosition pos) {
            Matcher matcher = NUMBER_PATTERN.matcher(text);
            if (matcher.matches()) {
                return super.parse(text, pos);
            }
            return null;
        }
    }
现在,我对JFormattedTextField使用这个十进制格式。由于语言环境本身不能设置为十进制格式,因此我必须创建适当的十进制格式符号并进行设置

    DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(Locale.US);
    DecimalFormat strictFormat = new StrictDecimalFormat();
    strictFormat.setDecimalFormatSymbols(decimalFormatSymbols);

    JDialog dialog = new JDialog();
    JPanel panel = new JPanel(new BorderLayout());
    dialog.getContentPane().add(panel);

    JFormattedTextField textField = new JFormattedTextField(strictFormat);
    textField.setText("1,23");
    panel.add(textField, BorderLayout.CENTER);
    panel.add(new JButton("focus"), BorderLayout.EAST);

    dialog.pack();
    dialog.setVisible(true);