Как я могу получить длину содержимого JTextField по мере ввода пользователем?

StackOverflow https://stackoverflow.com/questions/401598

  •  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());
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top