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

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

因为。如果在这里阅读,.length()总是错误的。

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

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

evt.getDocument().getLength() 

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

这可能与这个“错误”(或更确切地说是“特征”)有关

在处理关键事件之前,通知听众,以允许听众通过消费来“窃取”事件。 这提供了与消费事件的旧awt概念的兼容性。
“键入”事件并不意味着文本已输入组件 。 这不是一个错误,它是预期的行为。

一种可能的解决方案是收听相关文档

 // 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上的字段中键入。

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

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

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

使用此代码:

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