8

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

因此,如果在此处阅读, .length() 总是错误的。

必须有一种简单的方法来获取用户击键后出现的长度?

4

4 回答 4

10

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

evt.getDocument().getLength()

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

于 2008-12-30T21:48:56.257 回答
3

这可能与此“错误”(或更确切地说是“功能”)有关

在处理关键事件之前,侦听器会被通知关键事件,以允许侦听器通过使用它们来“窃取”事件。这提供了与消费事件的旧 awt 概念的兼容性。
“typed”事件并不意味着文本被输入到组件中。这不是错误,而是预期的行为。

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

// 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 上的程序化“setText()”或用户在 UI 上的字段中键入。

于 2008-12-30T21:50:15.473 回答
3

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

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

在这种情况下,您可能想要转到Document并添加更高级别的侦听器。对于 Swing,尽早选择模型是个好主意——“J”类接口是不连贯的。如果您正在拦截输入数据,那么您可能需要一个自定义模型(或者在Documenta的情况下DocumentFilter)。

于 2008-12-30T22:10:57.583 回答
2

使用此代码:

public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
    System.out.println(jTextField6.getText().length());
}
于 2013-10-08T15:52:59.820 回答