1

我有这段代码,在插入 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等)一起使用

4

1 回答 1

3

你可以使用DocumentSizeFilter

这是为此特定用途而制作的:http: //docs.oracle.com/javase/tutorial/uiswing/examples/components/TextComponentDemoProject/src/components/DocumentSizeFilter.java

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

从那里引用:

为了限制文档中允许的字符,DocumentSizeFilter 覆盖 DocumentFilter 类的 insertString 方法,每次将文本插入文档时都会调用该方法。它还覆盖了 replace 方法,该方法最有可能在用户粘贴新文本时被调用。通常,当用户键入或粘贴新文本或调用 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(); }
于 2013-05-21T13:55:59.003 回答