【发布时间】:2008-12-30 21:41:38
【问题描述】:
JTextField 有一个 keyTyped 事件,但似乎在它触发时单元格的内容还没有改变。
因为如果在这里阅读 .length() 总是错误的。
必须有一种简单的方法来获取用户击键后显示的长度吗?
【问题讨论】:
标签: java swing events jtextfield
JTextField 有一个 keyTyped 事件,但似乎在它触发时单元格的内容还没有改变。
因为如果在这里阅读 .length() 总是错误的。
必须有一种简单的方法来获取用户击键后显示的长度吗?
【问题讨论】:
标签: java swing events jtextfield
这可能不是最佳方式(而且已经有一段时间了),但在过去,我已将 DocumentListener 添加到 JTextField 和任何事件(插入、更新、删除)上我:
evt.getDocument().getLength()
返回文本字段内容的总长度。
【讨论】:
这可能和这个"bug" (or rather "feature")有关
在处理关键事件之前,会通知侦听器 允许侦听器通过消费事件来“窃取”事件。这给 与消费事件的旧 awt 概念兼容。
“类型化” 事件并不意味着文本被输入到组件中。这不是一个 错误,这是预期的行为。
一个可能的解决方案是收听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 上的程序化“setText()”或用户在 UI 上的字段中键入。
【讨论】:
KeyEvents 是低级事件,在这里不合适[听起来很熟悉]。
JTextField 系统如何知道输入了一个字符?通过键类型事件(IIRC,通过 PL&F 完成)。事件是否在您的侦听器之前被分派到系统侦听器?它可能会也可能不会。
在这种情况下,您可能希望转到Document 并添加更高级别的侦听器。对于 Swing,尽早选择模型是个好主意——“J”类接口是不连贯的。如果您正在拦截输入数据,那么您可能需要一个自定义模型(或者在 Document 的情况下为 DocumentFilter)。
【讨论】:
使用此代码:
public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
System.out.println(jTextField6.getText().length());
}
【讨论】: