0

我如何用代码做到这一点?我知道我可以使用 a JFormattedTextField,但我正在制作自己的库,以便JTextFields 也可以做到这一点。以下是我尝试过的方法:

  1. OnKeyRelease:是的,这是我找到的最好的方法,我用“”替换了我想要的所有字符。但它有点慢,我的意思是当键按下时它仍然显示禁止字符,并在键释放时删除字符,就像它的事件名称一样。这让我很困扰。
  2. evt.consume:我不知道为什么这种方法适用于除数字和字母之外的任何东西,例如 Backspace、Home 等。知道如何使这种方法也适用于数字或字母吗?

如果您能给我一个线索或链接,我将不胜感激,谢谢:)

4

1 回答 1

1

如果您能给我一个线索或链接,我将不胜感激,谢谢:)

文本组件功能如何- 实现文档过滤器

要实现文档过滤器,请创建一个子类,DocumentFilter然后使用该类setDocumentFilter中定义的方法将其附加到文档中AbstractDocument

这可能会有所帮助:

public class NoAlphaNumFilter extends DocumentFilter {
    String notAllowed = "[A-Za-z0-9]";
    Pattern notAllowedPattern = Pattern.compile(notAllowed);
    public void replace(FilterBypass fb, int offs,
                        int length, 
                        String str, AttributeSet a)
        throws BadLocationException {

        super.replace(fb, offs, len, "", a); // clear the deleted portion

        char[] chars = str.toCharArray();
        for (char c : chars) {
            if (notAllowedPattern.matcher(Character.toString(c)).matches()) {
                // not allowed; advance counter
                offs++;
            } else {
                // allowed
                super.replace(fb, offs++, 0, Character.toString(c), a);
            }
        }
    }
}

将此应用于JTextField

((AbstractDocument) myTextField.getDocument()).setDocumentFilter(
  new NoAlphaNumFilter());
于 2013-06-07T15:22:53.007 回答