带正则表达式的MaskFormatter

克里兹

我试图制作一个设置为接受浮点数的文本字段,并且为此使用了正则表达式。我有一个问题,因为当我输入数字(例如12345.67)时,然后当我尝试擦除输入时,无法擦除数字1 ..为什么?

import javax.swing.*;
import javax.swing.text.*;

public class DecimalFormatter extends DefaultFormatter {

  protected java.util.regex.Matcher matcher;

  public DecimalFormatter(java.util.regex.Pattern regex) {
    setOverwriteMode(false);
    matcher = regex.matcher("");
  }

  public Object stringToValue(String string) throws java.text.ParseException {
    if (string == null) return null;
    matcher.reset(string);

    if (! matcher.matches())
      throw new java.text.ParseException("does not match regex", 0);

    return super.stringToValue(string);
  }


  public static void main(String argv[]) {

    JLabel lab1 = new JLabel("Decimal:");
    java.util.regex.Pattern Decimal = java.util.regex.Pattern.compile("^[1-9]\\d{0,4}([.]\\d{0,2})?$",  java.util.regex.Pattern.CASE_INSENSITIVE);
    DecimalFormatter decimalFormatter = new DecimalFormatter(Decimal);
    decimalFormatter.setAllowsInvalid(false);
    JFormattedTextField ftf1 = new JFormattedTextField(decimalFormatter);

    JFrame f = new JFrame("DecimalFormatter Demo");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel pan1 = new JPanel(new java.awt.BorderLayout());
    pan1.add(lab1, java.awt.BorderLayout.WEST);
    pan1.add(ftf1, java.awt.BorderLayout.CENTER);
    lab1.setLabelFor(ftf1);
    f.getContentPane().add(pan1, java.awt.BorderLayout.SOUTH);
    f.setSize(300, 80);
    f.setVisible(true);
  }
}
dcsohl

因为您的正则表达式不允许这样做。您的正则表达式匹配以1-9开头的字符串,然后是最多四个数字,然后是句点和最多两个数字。(我很好奇为什么0.5对您不合法,但这是一个单独的问题。)

空字符串(1在示例中删除后,您拥有的字符串)与此正则表达式不匹配,因此JFormattedTextField将不允许它。

最初构造时,JFormattedTextField您永远不要尝试将其与初始空值匹配,因此允许它。但是,当用户开始键入内容时,您将对随后输入的所有值(包括(如果适用)包括删除所有字符时的空字符串)进行匹配。

您可以尝试更改if (string == null) return null;if (string == null || string.trim().equals("")) return null;...,这将允许使用空白字段。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带条件的正则表达式

来自分类Dev

带if条件的正则表达式

来自分类Dev

带grep的正则表达式

来自分类Dev

带条件的正则表达式

来自分类Dev

带正则表达式的grep

来自分类Dev

带计数的正则表达式

来自分类Dev

带正则表达式(正则表达式)的IDN(域)的验证码

来自分类Dev

LastName,FirstName带空格的正则表达式

来自分类Dev

带警报的正则表达式名称测试

来自分类Dev

带占位符的正则表达式

来自分类Dev

带可选匹配组的正则表达式

来自分类Dev

带星号的正则表达式方括号

来自分类Dev

Python正则表达式:禁止带异常的字符

来自分类Dev

带圆括号的正则表达式

来自分类Dev

Java字符串带正则表达式

来自分类Dev

带箭头的PHP正则表达式(>>)

来自分类Dev

带¶符号的SQL正则表达式

来自分类Dev

PHP中带逗号的正则表达式

来自分类Dev

带尖括号的正则表达式行为

来自分类Dev

带空格的日期和时间正则表达式

来自分类Dev

字符串的正则表达式,带异常

来自分类Dev

正则表达式十六进制,带例外

来自分类Dev

带(,)和(。)的MoneyFormat的正则表达式

来自分类Dev

带撇号的正则表达式(Java)

来自分类Dev

带计数数字的正则表达式

来自分类Dev

带正则表达式的Python分块

来自分类Dev

Python正则表达式:禁止带异常的字符

来自分类Dev

带Powershell的Eventlog 4740的正则表达式模式

来自分类Dev

带正则表达式功能的条件语句的语法