当前位置: 首页 > 知识库问答 >
问题:

让JTextField接受混合字符串,只使用少量数字过滤文档

和光启
2023-03-14

我有一个不寻常的问题,有些东西工作得有点太好了。我已经写了一个DocumentFilter开关,它只允许用户以数字的形式输入,DocumentFilter在书写过程中在适当的位置添加破折号。在JTextField中可以看到这样的日期:“2016-05-01”。问题是JTextField并非总是由用户填写,有时必须由程序设置。但当我使用code setText(“2016-05-01”)时,它不能正确显示,所有的破折号都消失了。如何让它工作?我试图更改DocumentFilter以允许dash,但这就是为什么在许多其他地方会出现问题的原因。我可能会为此写另一个DocumentFilter,但也许还有其他方法?是否可以逐个字符追加JTextFieldchar?有没有办法打开或关闭文档过滤器,或者可以灵活地更改文档过滤器,这样它就不会在其他地方崩溃,也不会在这里工作?下面是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个答案

鲁俊友
2023-03-14

你可以这样做:

@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");
 类似资料:
  • 问题内容: 我已经在netbeans注册中完成了一个示例项目。在jtextfield1中是用户ID,在Jtextfiled7中是国家/地区,两者都必须使用非数字字符或不允许的空格和特殊字符。怎么可能? 问题答案: @Vivek, 我对你问的这个问题有答案。请按照以下说明进行操作。 在Netbeans中,右键单击JTextfield,然后选择键入事件>> key >> key,然后在代码之间输入以下

  • 下面是关于如何限制字符输入长度的代码 可以通过

  • 我有一个,我希望用户输入一个人的姓名。我认为名称应该包含、和示例。我正在使用来验证用户输入。但是,我不知道如何在我的中设置它。 问题:我应该如何修改我的过滤器来实现上述行为? 任何关于如何验证一个人的名字的建议都被接受。 这是我的DocumentFilter: 这是我的测试类:

  • 我希望我的文本字段只接受数字(数字)和一个点,因为这是一个用户可以在其中写入产品价格的字段。我有这个代码,但它不能很好地工作,它只接受数字和删除。 有人能帮我修一下吗?

  • 问题内容: 说我有一个变量,它的定义为: 我想输出,我可以这样: 但是我宁愿将代码简化为类似以下内容(不起作用): 有没有办法像对待变量一样对待它呢? 问题答案: 直接在字符串中插入变量时,可以使用花括号消除歧义。 此外,这不适用于单引号。所以: 将输出

  • 我试图将文本视图字符限制为英语。但如果我复制并粘贴非英语字符,我的文本视图就会接收这些条目。谁能帮我解决这个问题。UITextView应该只接受英文字符(包括特殊字符、数字和空格)。或者,当我点击done时,如果textview包含非英语字符,它应该验证并向我发送错误消息。 提前谢谢。 下面是我的代码 此代码不允许我输入空格和特殊字符。需要帮忙解决这个问题。