InputVerifiers не активируется при программной установке текста

У меня есть свинг-приложение с JTextFields, к которому я прикрепляю InputVerifiers. У меня есть допустимые значения по умолчанию, примененные к полям с помощью метода setText, например.

this.myField.setText("11");

Но кажется, что public boolean verify(JComponent component) не вызывается, если к полям не применяется фокус. Я пытался программно запросить фокус, но, похоже, это все еще не запускает InputVerifier, например.

this.myField.requestFocus();

Как я могу программно установить текст текстового поля и заставить мой InputVerifier сработать и запустить его метод verify()?

Я мог бы вручную запустить InputVerifier после его создания, вызвав verify() и передав компонент, но это кажется действительно ненужным, поскольку TextField уже подключен к InputVerifier.


person Stealth Rabbi    schedule 30.04.2013    source источник
comment
InputVerifier по умолчанию запускает это событие, если там реализовано действие Swing (ev ActionListener), содержащее shouldYieldFocus() и проверку, может быть применено для JTextComponents и производных редакторов для JSpinner и JComboBox, для лучшей помощи раньше опубликуйте SSCCE, короткий, исполняемый, компилируемый   -  person mKorbel    schedule 30.04.2013
comment
ваш SSCCE может быть основан на   -  person mKorbel    schedule 30.04.2013
comment
Я думаю, вы говорите прикрепить действие, которое сработает и вызовет методы проверки ввода? Когда это действие будет запущено?   -  person Stealth Rabbi    schedule 30.04.2013


Ответы (2)


У меня есть действительные значения по умолчанию, примененные к полям с помощью метода setText

Если значение по умолчанию допустимо, зачем вам нужно вызывать верификатор ввода?

Я пытался программно запросить фокус

Правильный метод использования:

component.requestFocusInWindow()

однако это работает только при запросе фокуса на компоненте в видимом графическом интерфейсе.

где есть что-то, что позволяет вам проверить статус действительности всех ваших полей

Эта логика должна быть частью кнопки «Отправить». InputVerifier должен проверять только достоверность данных для поля. Логика «Отправить» проверяет, были ли введены данные для всех полей.

person camickr    schedule 30.04.2013
comment
Итак, логика валидности находится в InputVerifier, но как поведение кнопки отправки будет проверять валидность всех полей, помимо явного вызова verify(component)? - person Stealth Rabbi; 30.04.2013
comment
Кнопке Submit не нужно проверять каждый компонент, это уже сделал InputVerifier. Все, что нужно сделать кнопке «Отправить», — это убедиться, что все текстовые поля содержат данные (т. е. текстовое поле не пусто). - person camickr; 30.04.2013
comment
Если ваш InputVerifier не удерживает фокус, у вас могут быть недопустимые поля, которые необходимо проверить. Вот где моя проблема. - person Stealth Rabbi; 30.04.2013
comment
Нет, у вас не может быть недопустимых полей только потому, что компонент теряет фокус. Верификатор ввода вызывается, когда текстовое поле теряет фокус. Таким образом, вы проверяете текстовое поле в это время. Данные могут измениться только в том случае, если текстовое поле снова получит фокус. Поэтому, когда он теряет фокус, он будет проверен снова. - person camickr; 01.05.2013
comment
В моем случае shouldYieldFocus() всегда возвращает true. Поле проверено, но дает фокус. Я не хочу, чтобы поведение заставляло пользователя застревать в поле. Да, если значение по умолчанию допустимо, его не нужно вызывать, но сейчас у него есть флаг, который определяет, было ли поле «действительным» после последнего вызова verify(), который не вызывается. - person Stealth Rabbi; 01.05.2013

Вы можете установить DocumentFilter на myField. Ваш verify() не должен иметь побочных эффектов, поэтому вы можете использовать его в фильтре. Фильтр будет применяться при вызове setText() или при каждом изменении Document.

person Catalina Island    schedule 30.04.2013
comment
Однако мои входные верификаторы имеют побочные эффекты. возможно, я делаю это неправильно. Они устанавливают действующий флаг, который впоследствии можно запросить, чтобы определить, все ли поля в форме действительны. Они также украшают поле в зависимости от того, проходит ли оно проверку или нет. - person Stealth Rabbi; 30.04.2013
comment
API говорит: "Этот метод должен иметь никаких побочных эффектов. - person Catalina Island; 30.04.2013
comment
Извините, это немного выходит за рамки моего первоначального вопроса, но неясно, как вы могли бы использовать InputVerifiers для управления возможностью выполнять функцию «отправить» в форме. Вы можете независимо проверять каждое поле, но если поле теряет фокус, где есть что-то, что позволяет вам проверить статус достоверности всех ваших полей, чтобы определить, можете ли вы отправить форму? Вот почему я создал свой собственный класс для управления этим, и мне просто нужно вручную запустить верификатор по запросу. Возможно, DocumentFilter — это ответ. - person Stealth Rabbi; 30.04.2013
comment
Если вы не хотите, чтобы пользователь застрял в поле, вы можете включить кнопку Submit только тогда, когда все ваши поля действительны. Вы можете сделать проверку в каждом поле shouldYieldFocus() и actionPerformed(). Поле состояния также полезно. - person Catalina Island; 01.05.2013