2013-10-09 26 views
2

我想让一个设置为接受浮动的文本框,我正在使用正则表达式..我有一个问题,因为当我输入数字为例如12345.67然后当我尝试擦除输入我不能删除数字1 ..为什么?>MaskFormatter与正则表达式

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); 
    } 
} 

回答

0

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

空字符串(你在你的例子中删除了1之后)与此正则表达式不匹配,所以JFormattedTextField不会允许它。

当您最初构建JFormattedTextField时,您绝不会尝试在初始空值上进行匹配,因此它可以被允许。但是,当用户开始输入时,您将对随后输入的所有值执行匹配,包括(如果适用)删除所有字符时的空字符串。

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

+0

所以这就是为什么..该字符串不会返回为空...哦是啊我也想到了它现在我只是改变正则表达式能够接受0.5 ..非常感谢您指出该错误 – Criz