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:
import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;
import java.awt.Window;
public class AddOrderFocusTraversalPolicy extends FocusTraversalPolicy
{
@Override
public Component getComponentAfter(Container aContainer, Component aComponent)
{
int indexCmp = -1;
for(int i = 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)))
return aContainer.getComponent(i + 1);
}
return null;
}
@Override
public Component getComponentBefore(Container aContainer, Component aComponent)
{
int indexCmp = -1;
for(int i = 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)))
return aContainer.getComponent(i - 1);
}
return null;
}
@Override
public Component getFirstComponent(Container aContainer)
{
for(int i = 0; i < aContainer.getComponentCount(); i++)
if (accept(aContainer.getComponent(i)))
return aContainer.getComponent(i);
return null;
}
@Override
public Component getLastComponent(Container aContainer)
{
for(int i = aContainer.getComponentCount()-1; i >= 0; i--)
if (accept(aContainer.getComponent(i)))
return aContainer.getComponent(i);
return null;
}
@Override
public Component getDefaultComponent(Container aContainer)
{
return getFirstComponent(aContainer);
}
protected boolean accept(Component aComponent)
{
if (!(aComponent.isVisible() && aComponent.isDisplayable() &&
aComponent.isFocusable() && aComponent.isEnabled()))
{
return false;
}
// Verify that the Component is recursively enabled. Disabling a
// heavyweight Container disables its children, whereas disabling
// a lightweight Container does not.
if (!(aComponent instanceof Window))
{
for (Container enableTest = aComponent.getParent();
enableTest != null;
enableTest = enableTest.getParent())
{
if (!(enableTest.isEnabled() || enableTest.isLightweight()))
{
return false;
}
if (enableTest instanceof Window)
{
break;
}
}
}
return true;
}
}
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 …