А при заходе ещё неизвестно что там будет введено, соответственно ещё неизвестно куда переходить. Если же вызывать setFocusTraversalPolicy() или setNextFocusableComponent() в верифеере или в обработчике focusLost - то они уже не влияют на порядок смены фокуса. Swing запоминает в какое поле нужно перейти ДО вызова верифиера.
я с этим делом возился лет 5 назад, сейчас уже точно не помню что да как, но эту проблему побороть вполне неально. может VetoableChangeListener попробовать? "VetoableChangeListeners are notified of the state change before the change is reflected in the KeyboardFocusManager. Conversely, PropertyChangeListeners are notified after the change is reflected. It follows that all VetoableChangeListeners will be notified before any PropertyChangeListener." http://download.oracle.com/javase/1.5.0/docs/api/java/awt/doc-files/FocusSpec.html#FocusTraversalPolicyProviders
Попробовал VetoableChangeListener, но если он выбрасывает иксепшн чтобы предотвратить переход в поле, а из того поля не выпускает InputVerifier, то на первое поле фокус не возвращается.
Вызов setFocusTraversalPolicy() (или setNextFocusableComponent) в верифеере или в обработчике focusLost уже не влияют на порядок смены фокуса. Swing запоминает в какое поле нужно перейти ДО вызова верифиера, а focusLost вызывается когда переход уже произошёл.
1.я не имел в виду в верифаере его устанавливать, а обернуть в компонент 3 ваших поля и на него поставить траверсал-полиси(т.е. вообще при инициализации)
2. ваш солюшн скорее всего подходит вам, но не отвечает на задачу, которую вы описали насчет зависимости перехода от ввода(задача довольно интересная по-моему)...или я не правильно вас понял...
1. Так определить куда переходить можно когда пользователь уже ввёл значение и нажал таб - т.е. или в верифиере или по focusLost, а в это время порядок уже не изменишь даже со своей траверсал-полиси.
2. Вопщем отвечает, так как можно по focusLost установить фокус в произвольное поле, ну т.е. фокус сначала прыгнет в следующее по порядку, но кастомный InputVerifier отпустит фокус в нужное поле и не будет выполнять verify().
Определить куда переходить можно только когда пользователь уже ввёл значение и нажал таб - т.е. или в верифиере или по focusLost, а в это время порядок уже не изменишь даже со своей траверсал-полиси, так как элемент куда надо перейти определяется ДО вызова верифиера и тем более до focusLost.
А нельзя просто disable'ить поля в зависимости от ввода в предыдущие? Как выше уже заметили менять последовательность перехода зло т.к. неочевидно для пользователя. С выключением полей будет понятно куда перейдет фокус.
Comments 24
Reply
Если же вызывать setFocusTraversalPolicy() или setNextFocusableComponent() в верифеере или в обработчике focusLost - то они уже не влияют на порядок смены фокуса. Swing запоминает в какое поле нужно перейти ДО вызова верифиера.
Reply
"VetoableChangeListeners are notified of the state change before the change is reflected in the KeyboardFocusManager. Conversely, PropertyChangeListeners are notified after the change is reflected. It follows that all VetoableChangeListeners will be notified before any PropertyChangeListener."
http://download.oracle.com/javase/1.5.0/docs/api/java/awt/doc-files/FocusSpec.html#FocusTraversalPolicyProviders
Reply
буду пробовать, спасибо.
Reply
Солюшн нашёл, см. апдейт к посту.
Reply
http://download.oracle.com/javase/7/docs/api/java/awt/Container.html#setFocusTraversalPolicyProvider(boolean)
на container этих 3 полей и соответствующая имплементация
http://download.oracle.com/javase/7/docs/api/java/awt/FocusTraversalPolicy.html
?
Reply
Солюшн нашёл, см. апдейт к посту.
Reply
1.я не имел в виду в верифаере его устанавливать, а обернуть в компонент 3 ваших поля и на него поставить траверсал-полиси(т.е. вообще при инициализации)
2. ваш солюшн скорее всего подходит вам, но не отвечает на задачу, которую вы описали насчет зависимости перехода от ввода(задача довольно интересная по-моему)...или я не правильно вас понял...
Reply
2. Вопщем отвечает, так как можно по focusLost установить фокус в произвольное поле, ну т.е. фокус сначала прыгнет в следующее по порядку, но кастомный InputVerifier отпустит фокус в нужное поле и не будет выполнять verify().
Reply
вешать его на конейнер компонентов в момент создания и все будет хорошо
Reply
Reply
public abstract Component getComponentAfter(Container, Component);
public abstract Component getComponentBefore(Container, Component);
Reply
Reply
Reply
Reply
Leave a comment