使JTextField接受混合字符串,whet documentFIlter只允许数字

时间:2016-05-20 06:50:56

标签: java jtextfield documentfilter

我有一些不寻常的问题,有些事情正在发挥作用。我写了一个DocumentFilter女巫只允许用户输入数字,DocumentFilter在写作过程中在适当的位置添加短信。 JTextField中的这种方式是这样的可见日期:“2016-05-01”。问题是JTextField并不总是由用户填写,有时必须由程序设置。但是当我使用代码setText(“2016-05-01”)时,它无法正常显示,所有短划线都消失了。如何使它工作? 我试图更改DocumentFilter以允许破折号,但这也是导致许多其他地方出现问题的原因。我可能最终会为此写另一个DocumentFilter,但也许还有另外一种方法?是否可以通过char追加JTextField char?有没有办法打开DocumentFilter关闭,或者可以巧妙地改变DocumentFilter,这样它就不会在奥得河中碾压并在这里工作?下面是DocumentFilter

的部分代码
  public void replace(FilterBypass fb, int offs, int length, String str,
    AttributeSet a) throws BadLocationException {

if (str == null || str.equals(""))
{
    super.replace(fb, offs, length, str, a); 
}
else
{
    StringBuffer buffer = new StringBuffer(str);
    for (int i = buffer.length() - 1; i >= 0; i--)
    {
    char ch = buffer.charAt(i);
    if (!Character.isDigit(ch))
    {
        buffer.deleteCharAt(i);
    }
    }

    str = buffer.toString();
    //sign and sign2 is char number were separator(sep) is written 
    if (fb.getDocument().getLength() + str.length() == sign)
    {
    str = str + sep;
    }
    if (fb.getDocument().getLength() + str.length() == sign2)
    {
    str = str + sep;
    }


    if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters)
    super.replace(fb, offs, length, str, a);
    else
    Toolkit.getDefaultToolkit().beep();
}

1 个答案:

答案 0 :(得分:0)

您可以这样做:

@Override
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {
    if (str == null || str.equals("")) {
        super.replace(fb, offs, length, str, a);
    } else {
        // check if 'str' contains 8 digits
        if (str.matches("^\\d{8}$")) {
            // add the dashes
            super.replace(fb, offs, length, str.replaceAll("(\\d{4})(\\d{2})(\\d{2})", "$1-$2-$3"), a);
        } else {
            StringBuffer buffer = new StringBuffer(str);
            for (int i = buffer.length() - 1; i >= 0; i--) {
                char ch = buffer.charAt(i);
                if (!Character.isDigit(ch)) {
                    buffer.deleteCharAt(i);
                }
            }

            str = buffer.toString();
            // sign and sign2 is char number were separator(sep) is written
            if (fb.getDocument().getLength() + str.length() == sign) {
                str = str + sep;
            }
            if (fb.getDocument().getLength() + str.length() == sign2) {
                str = str + sep;
            }

            if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters)
                super.replace(fb, offs, length, str, a);
            else
                Toolkit.getDefaultToolkit().beep();
        }
    }
}

并使用以下方式设置文本:

textField.setText("20160420");