如何在用户输入时获取JTextField内容的长度?

时间:2008-12-30 21:41:38

标签: java swing events jtextfield

JTextField有一个keyTyped事件,但似乎在它触发时,单元格的内容尚未更改。

因为在这里读取.length()总是错误的。

必须有一种简单的方法来获得按键击中后用户看到的长度吗?

4 个答案:

答案 0 :(得分:8)

这可能不是最佳方式(并且已经有一段时间了),但在过去,我已经向JTextField和任何事件添加了一个DocumentListener(插入,更新,删除)I:

evt.getDocument().getLength()

返回文本字段内容的总长度。

答案 1 :(得分:3)

这可能与此"bug" (or rather "feature")

有关
  

在处理关键事件之前,会通知听众   允许听众通过消费来“窃取”事件。这给了   兼容旧的消费事件概念   “打字”   事件并不意味着文本已输入组件。这不是   这是一种行为。

可能的解决方案是收听associated Document

// Listen for changes in the text
myTextField.getDocument().addDocumentListener(new DocumentListener() {
  public void changedUpdate(DocumentEvent e) {
  // text was changed
}
public void removeUpdate(DocumentEvent e) {
  // text was deleted
}
public void insertUpdate(DocumentEvent e) {
  // text was inserted
}
});
  

注意无论文本如何变化,这都有效;通过剪贴板剪切/粘贴,在TextField上使用progamatic“setText()”,或者用户在UI上输入字段。

答案 2 :(得分:3)

KeyEvent是不合适的低级事件[听起来很熟悉]。

JTextField系统如何知道某个字符已被输入?通过一个关键的类型事件(IIRC,通过PL& F完成)。事件是否在侦听器之前调度到系统侦听器?它可能会也可能不会。

在这种情况下,您可能希望转到Document并添加更高级别的侦听器。使用Swing,早期使用模型是一个好主意 - 'J'类接口是不连贯的。如果您要拦截输入数据,那么您可能需要自定义模型(或Document一个DocumentFilter)。

答案 3 :(得分:2)

使用此代码:

public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
    System.out.println(jTextField6.getText().length());
}