Как я могу получить длину содержимого 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());
}
Другие вопросы по тегам