gpt4 book ai didi

java - 带正则表达式的 MaskFormatter

转载 作者:行者123 更新时间:2023-11-29 08:57:49 25 4
gpt4 key购买 nike

我正在尝试制作一个设置为接受 float 的文本字段,并且我为此使用了正则表达式。我遇到了问题,因为当我输入数字时,例如 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);
}
}

最佳答案

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

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

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

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

关于java - 带正则表达式的 MaskFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19273283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com