Как я могу получить длину содержимого JTextField по мере ввода пользователем?
-
03-07-2019 - |
Вопрос
JTextField имеет событие с типом ключа, но кажется, что на момент его запуска содержимое ячейки еще не изменилось.
Из-за этого .length() всегда неверно, если читать здесь.
Должен быть простой способ получить длину в том виде, в каком она представляется пользователю после нажатия клавиши?
Решение
Вероятно, это не оптимальный способ (и прошло некоторое время), но в прошлом я добавлял DocumentListener в JTextField и при любом из событий (insert, update, remove) я:
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
}
});
Примечание. это работает независимо от того, как изменяется текст;с помощью вырезания / вставки из буфера обмена, прогибы "setText ()" в текстовом поле или ввода пользователем текста в поле пользовательского интерфейса.
KeyEvent
это низкоуровневые события, которые здесь неуместны [звучит знакомо].
Как работает JTextField
система знает, что был введен символ?Через событие, введенное с помощью ключа (IIRC, выполняется через PL & F).Отправляется ли событие системному прослушивателю раньше вашего прослушивателя?Это может сработать, а может и не сработать.
В этом случае вы, вероятно, захотите обратиться к Document
и добавьте слушателя более высокого уровня.С Swing рекомендуется использовать модель как можно раньше - интерфейсы класса 'J' некогерентны.Если вы перехватываете входные данные, то вам, вероятно, нужна пользовательская модель (или, в случае Document
a DocumentFilter
).
Используйте этот код:
public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
System.out.println(jTextField6.getText().length());
}