Java n个字符后的块文本写入

Java n个字符后的块文本写入,java,swing,keylistener,jtextcomponent,documentfilter,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();

我有一段代码,在插入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
,但是我希望这段代码能够与通用文本输入组件一起工作,比如
JTextPane
JTextArea
,等等您可以使用
DocumentSizeFilter

这是为这种特殊用途而制造的:

有关如何在实现文档过滤器中执行此操作的教程部分:

从那里引用:

要限制文档中允许的字符,请选择DocumentSizeFilter 重写DocumentFilter类的insertString方法,该方法是 每次将该文本插入文档时调用。它也 重写replace方法,该方法最有可能在 用户粘贴新文本。通常,会导致文本插入 当用户键入或粘贴新文本时,或当setText方法 被称为。下面是DocumentSizeFilter类的 insertString方法:

public void insertString(FilterBypass fb,int offs,
字符串str,属性集a)
抛出BadLocationException{

如果((fb.getDocument().getLength()+str.length())这可能会有所帮助:似乎documentFilter是解决所有这些情况的方法。JTextPane支持文档,至于JTextArea:实现
JTextComponent
接口的任何东西都有一个文档。如果特定文档支持setDocumentFilter(例如,如在
抽象文档
)中,您可以使用此方法。
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(); }