防止JTextField中的字母数字

时间:2013-06-07 15:20:44

标签: java swing jtextfield jformattedtextfield

如何使用代码执行此操作?我知道我可以使用JFormattedTextField,但我正在创建自己的库,以便JTextField也可以这样做。以下是我尝试过的方法:

  1. OnKeyRelease:是的,这是我找到的最好的方法,我用“”取代了我想要的所有字符。但它有点慢,我的意思是它仍然会在键关闭时显示禁止的字符,并在键释放时删除字符,就像它的事件名称一样。哪个困扰我。
  2. evt.consume:我不知道为什么这个方法适用于除数字和字母之外的任何东西,例如Backspace,Home等。任何想法如何使这个方法也适用于数字或字母?
  3. 如果您能给我一个线索或链接,我将不胜感激,谢谢:)

1 个答案:

答案 0 :(得分:1)

  

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

Text Component Features - Implementing a Document Filter怎么样?

  

要实现文档过滤器,请创建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());