Как вызвать Java Swing InputVerifier при входе в JComboBox (actionPerformed)? - PullRequest
1 голос
/ 29 июня 2010

У меня есть Swing JComboBox с InputVerifier, установленным правильно.

Я использую поле со списком, чтобы установить целое число.

Если я наберу «cat» в поле и нажму «tab», мой InputVerifier сработает и сбросит значение до «0».

Если я наберу "cat" и нажму enter, мой InputVerifier никогда не будет вызываться с actionPerformed. Нужно ли явно звонить моему InputVerifier из actionPerformed?

Какова лучшая модель для проверки моего JComboBox на вкладке и ввода? Похоже, это что-то, что мне нужно дать "бесплатно" моделью свинга.

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Проблема «нажать вкладку» и «нажать Enter» означают две разные вещи в Java Swing. Но эти два действия означают одно и то же для вас, меня и пользователя.

Swing не имеет единого механизма для обнаружения «когда пользователь заканчивает ввод данных». Вместо этого Swing фокусируется на механике «это поле теряет фокус клавиатуры» и «пользователь нажимает клавишу Enter, находясь внутри поля».

Семантически эти два действия означают одно и то же с точки зрения пользователя: «Я закончил. Вот мой вклад». Но из того, что я могу сказать, Swing не может предложить способ обнаружить намерение пользователя. Меня так же, как и вас, удивляет отсутствие такой функции, так как это, кажется, самая базовая функция формы в графическом интерфейсе. Нам нужно, но не нужно, событие dataEntered.

Есть обходной путь…

В аналогичном контексте (JTextField вместо JComboBox) Sun / Oracle Java Tutorial предоставляет пример InputVerificationDemo , где создается класс:

  • Расширяет InputVerifier (для обработки вкладок / щелчков, когда фокус может быть потерян)
  • Реализация ActionListener (для обработки нажатия клавиши Enter без выхода из поля)

Хорошая вещь в этом обходном пути заключается в том, что вы можете найти свой код обработки всего в одном месте. Недостатком является то, что у вас все еще есть проблемы:

  • Создание отдельного класса.
  • Создание этого класса.
  • Передача этого экземпляра в методы setInputVerifier и addActionListener вашего виджета (JTextField и т. Д.).
1 голос
/ 29 июня 2010

При использовании редактируемого поля со списком фокус находится на JTextField, который используется в качестве редактора поля со списком Вы можете добавить ActionListener в это текстовое поле.

В ActionListener вы можете попробовать вызвать метод TransferFocus (), который должен быть эквивалентен табуляции нашего текстового поля. Если это не сработает, то actionListener должен вызвать тот же код редактирования, что и InputVerifier.

1 голос
/ 29 июня 2010

Это ожидаемое поведение InputVerifier: клавиша TAB пытается изменить фокус, а клавиша ENTER - нет.Вы можете связать клавишу ENTER с другим действием, как описано в руководстве Как использовать связывание клавиш .Также рассмотрим информативную статью Привязки клавиш , в которую входит удобное служебное приложение.

...