我有这段代码,在插入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
等
答案 0 :(得分:3)
您可以使用DocumentSizeFilter
类
如何在实施文档过滤器部分
中执行此操作的教程从那里引用:
限制文档中允许的字符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(); }