Здесь есть два решения:
. Я бы выбрал первое решение, которое позволит вашим событиям оставайся приватным
Это - вероятно, не оптимальный путь (и это было некоторое время), но в прошлом я добавил DocumentListener к JTextField, и на любом из событий (вставьте, обновите, удалите), я:
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
}
});
Обратите внимание, что это работает, неважно, как текст изменяется; через сокращение/вставку буфера обмена, progamatic "setText ()" на TextField или пользователе, вводящем в поле на UI.
KeyEvent
s являются событиями низкого уровня, которые не являются соответствующими здесь [который звучит знакомым].
Как делает JTextField
система знает, что символ был введен? Через ключ ввел событие (IIRC, сделанный через PL&F). Событие становится отправленным системному слушателю перед Вашим слушателем? Это могло бы или не могло бы сделать.
В этом случае Вы, вероятно, хотите перейти в Document
и добавьте высокоуровневого слушателя. С Swing это - хорошая идея пойти для модели рано - интерфейсы класса 'J' являются несвязными. Если Вы прерываете входные данные, то Вы, вероятно, хотите пользовательскую модель (или в случае Document
a DocumentFilter
).