Как я могу получить длину содержимого JTextField в зависимости от типа пользователя? - PullRequest
8 голосов
/ 31 декабря 2008

JTextField имеет событие keyTyped, но кажется, что на момент запуска содержимое ячейки еще не изменилось.

Из-за этого .length () всегда неверно, если читать здесь.

Должен быть простой способ получить длину, которая отображается пользователю после нажатия клавиши?

Ответы [ 4 ]

8 голосов
/ 31 декабря 2008

Это, вероятно, не оптимальный способ (и это было давно), но в прошлом я добавлял DocumentListener в JTextField и для любого из событий (вставка, обновление, удаление) I:

evt.getDocument().getLength()

Возвращает общую длину содержимого текстового поля.

3 голосов
/ 31 декабря 2008

KeyEvent s - это события низкого уровня, которые здесь не подходят [звучит знакомо].

Как система JTextField узнает, что символ был напечатан? Через событие, набранное ключом (IIRC, выполнено через PL & F). Событие отправляется системному слушателю перед вашим слушателем? Это может или не может сделать.

В этом случае вы, вероятно, захотите перейти на Document и добавить слушателя более высокого уровня. С Swing хорошей идеей будет ранняя модель - интерфейсы класса 'J' непоследовательны. Если вы перехватываете входные данные, то вам, вероятно, нужна пользовательская модель (или в случае Document a DocumentFilter).

3 голосов
/ 31 декабря 2008

Это может быть связано с этой «ошибкой» (или скорее «функцией»)

Слушатели уведомляются о ключевых событиях до их обработки позволить слушателям «украсть» события, потребляя их. Это дает совместимость со старым понятием потребления событий.
"напечатано" событие не означает, что текст был введен в компонент . Это НЕ ошибка, это предполагаемое поведение.

Возможное решение - прослушать связанный документ

// 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, или пользователь вводит в поле в пользовательском интерфейсе.

2 голосов
/ 08 октября 2013

Используйте этот код:

public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
    System.out.println(jTextField6.getText().length());
}
...