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