swing, перемещение фокуса по условию

Mar 19, 2011 01:12

Господа, не могу решить проблему, не хватает знания свинга ( Read more... )

Leave a comment

Comments 24

drmastap March 19 2011, 00:24:31 UTC
при заходе в первое поле вызывать Container.setFocusTraversalPolicy(FocusTraversalPolicy policy)?

Reply

eros2 March 19 2011, 08:52:15 UTC
А при заходе ещё неизвестно что там будет введено, соответственно ещё неизвестно куда переходить.
Если же вызывать setFocusTraversalPolicy() или setNextFocusableComponent() в верифеере или в обработчике focusLost - то они уже не влияют на порядок смены фокуса. Swing запоминает в какое поле нужно перейти ДО вызова верифиера.

Reply


drmastap March 19 2011, 09:45:03 UTC
я с этим делом возился лет 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

Reply

eros2 March 19 2011, 10:37:15 UTC
Погуглил, нашёл какой-то семпл - http://www.java2s.com/Tutorial/Java/0260__Swing-Event/implementsVetoableChangeListenertoblockfocuschangeevents.htm

буду пробовать, спасибо.

Reply

eros2 March 19 2011, 16:15:41 UTC
Попробовал VetoableChangeListener, но если он выбрасывает иксепшн чтобы предотвратить переход в поле, а из того поля не выпускает InputVerifier, то на первое поле фокус не возвращается.

Солюшн нашёл, см. апдейт к посту.

Reply


zlobniyanonim March 19 2011, 14:54:26 UTC
может быть всё-таки не ветоабл, т.к. это вето на изменение, а
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

eros2 March 19 2011, 16:17:44 UTC
Вызов setFocusTraversalPolicy() (или setNextFocusableComponent) в верифеере или в обработчике focusLost уже не влияют на порядок смены фокуса. Swing запоминает в какое поле нужно перейти ДО вызова верифиера, а focusLost вызывается когда переход уже произошёл.

Солюшн нашёл, см. апдейт к посту.

Reply

zlobniyanonim March 19 2011, 16:30:34 UTC
ок.

1.я не имел в виду в верифаере его устанавливать, а обернуть в компонент 3 ваших поля и на него поставить траверсал-полиси(т.е. вообще при инициализации)

2. ваш солюшн скорее всего подходит вам, но не отвечает на задачу, которую вы описали насчет зависимости перехода от ввода(задача довольно интересная по-моему)...или я не правильно вас понял...

Reply

eros2 March 19 2011, 16:44:52 UTC
1. Так определить куда переходить можно когда пользователь уже ввёл значение и нажал таб - т.е. или в верифиере или по focusLost, а в это время порядок уже не изменишь даже со своей траверсал-полиси.

2. Вопщем отвечает, так как можно по focusLost установить фокус в произвольное поле, ну т.е. фокус сначала прыгнет в следующее по порядку, но кастомный InputVerifier отпустит фокус в нужное поле и не будет выполнять verify().

Reply


ahtokca March 21 2011, 08:15:12 UTC
Все же использовать нада свой setFocusTraversalPolicy
вешать его на конейнер компонентов в момент создания и все будет хорошо

Reply

eros2 March 21 2011, 08:20:48 UTC
Так в момент создания неизвестно, каким будет порядок.

Reply

ahtokca March 21 2011, 08:36:17 UTC
Имплементацию для методов свою сделать и все будет хорошо

public abstract Component getComponentAfter(Container, Component);
public abstract Component getComponentBefore(Container, Component);

Reply

eros2 March 21 2011, 08:44:56 UTC
Определить куда переходить можно только когда пользователь уже ввёл значение и нажал таб - т.е. или в верифиере или по focusLost, а в это время порядок уже не изменишь даже со своей траверсал-полиси, так как элемент куда надо перейти определяется ДО вызова верифиера и тем более до focusLost.

Reply


alishka March 21 2011, 11:55:17 UTC
А нельзя просто disable'ить поля в зависимости от ввода в предыдущие? Как выше уже заметили менять последовательность перехода зло т.к. неочевидно для пользователя. С выключением полей будет понятно куда перейдет фокус.

Reply

eros2 March 21 2011, 12:08:44 UTC
Дисаблить не всегда подходит, потому что задисабленые поля становятся бледными и хуже читаются. Так что иногда лучше ставить рид-онли.

Reply


Leave a comment

Up