阻止n个字符后的文本写入

时间:2013-05-21 13:47:10

标签: java swing keylistener jtextcomponent documentfilter

我有这段代码,在插入n个字符后“禁用”JTextField上的用户输入:

JTextField tf = new JTextField();
tf.addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent e) {
        if (((JTextField) e.getSource()).getText().length() > n) {
            e.consume();
        }
    }
});

它有效,但我想知道是否有另一种选择,因为我在旧的慢速计算机上尝试它,当我在文本字段中输入字母时,字母被添加,然后它消失...我想避免使用用户输入后e.consume()并直接阻止插入。

有可能吗?

修改

我忘了提到我仅在此示例中使用JTextField,但我希望此代码能够使用通用文本输入组件,例如JTextPaneJTextArea

1 个答案:

答案 0 :(得分:3)

您可以使用DocumentSizeFilter

针对此特定用途: http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TextComponentDemoProject/src/components/DocumentSizeFilter.java

如何在实施文档过滤器部分

中执行此操作的教程

从那里引用:

  

限制文档中允许的字符DocumentSizeFilter   覆盖DocumentFilter类的insertString方法,即   每次将文本插入文档时调用。它也是   覆盖替换方法,最有可能在调用时调用   用户粘贴新文本。通常,可以导致文本插入   当用户在新文本中键入或粘贴时,或者当使用setText方法时   叫做。这是DocumentSizeFilter类的实现   insertString方法:

public void insertString(FilterBypass fb, int offs,
                         String str, AttributeSet a)
    throws BadLocationException {

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