Controlar Tab Order usando FocusTraversalPolicy na ordem em que sao adicionados no container
2 respostas
shinoob
tem coisas no java que dao tanto trabalho … mas tudo bem … tem outras coisas que seriam dificeis em outras linguagens que em java é facil …
eu ja vi uns exemplos de uns FocusTraversalPolicy, mas nenhum que atendece minha necessidade
alguem ai tem algum exemplo de um FocusTraversalPolicy que siga o foco conforme os componentes foram adicionados no container ???
tipo …
edt1 edt4
edt2 edt5
edt3 edt6
o java pula do edt1 pro edt4 … sendo q eu keria q fosse pela ordem de adicionamento …
do 1 pro 2 … do 2 pro 3 … e assim por diante
intaum… eu vi isso ai … mas nenhum desse fez o q eu keria …
um deles ate fez … mas nao pulava pro proximo Panel … so ficava circulando entre os componentes do proprio panel
ai eu fiz esse aki e deu certo:
importjava.awt.Component;importjava.awt.Container;importjava.awt.FocusTraversalPolicy;importjava.awt.Window;publicclassAddOrderFocusTraversalPolicyextendsFocusTraversalPolicy{@OverridepublicComponentgetComponentAfter(ContaineraContainer,ComponentaComponent){intindexCmp=-1;for(inti=0;i<aContainer.getComponentCount();i++){if(indexCmp==-1)if(aContainer.getComponent(i).equals(aComponent))indexCmp=i;if(i+1<aContainer.getComponentCount())if(indexCmp!=-1)if(accept(aContainer.getComponent(i+1)))returnaContainer.getComponent(i+1);}returnnull;}@OverridepublicComponentgetComponentBefore(ContaineraContainer,ComponentaComponent){intindexCmp=-1;for(inti=aContainer.getComponentCount()-1;i>0;i--){if(indexCmp==-1)if(aContainer.getComponent(i).equals(aComponent))indexCmp=i;if(i>=0)if(indexCmp!=-1)if(accept(aContainer.getComponent(i-1)))returnaContainer.getComponent(i-1);}returnnull;}@OverridepublicComponentgetFirstComponent(ContaineraContainer){for(inti=0;i<aContainer.getComponentCount();i++)if(accept(aContainer.getComponent(i)))returnaContainer.getComponent(i);returnnull;}@OverridepublicComponentgetLastComponent(ContaineraContainer){for(inti=aContainer.getComponentCount()-1;i>=0;i--)if(accept(aContainer.getComponent(i)))returnaContainer.getComponent(i);returnnull;}@OverridepublicComponentgetDefaultComponent(ContaineraContainer){returngetFirstComponent(aContainer);}protectedbooleanaccept(ComponentaComponent){if(!(aComponent.isVisible()&&aComponent.isDisplayable()&&aComponent.isFocusable()&&aComponent.isEnabled())){returnfalse;}// Verify that the Component is recursively enabled. Disabling a// heavyweight Container disables its children, whereas disabling// a lightweight Container does not.if(!(aComponentinstanceofWindow)){for(ContainerenableTest=aComponent.getParent();enableTest!=null;enableTest=enableTest.getParent()){if(!(enableTest.isEnabled()||enableTest.isLightweight())){returnfalse;}if(enableTestinstanceofWindow){break;}}}returntrue;}}
nao sei se essa seria a melhor codificacao, visto que ele faz um for que, em alguns casos, pode ficar meio lento … se alguem tiver uma solucao melhor …