Problema con el foco y varios jtextfield

Carlos
18 de Enero del 2005
Mi problema es que tengo varios jtextfield distribuidos en un jpanel, y me
gustaría ser yo el que eligiera el orden en el que el foco se mueve, es
decir que el foco empiece en el ultimo jtextfield y vaya subiendo hasta el
primero. Con el ultimo me refiero al que mas abajo esta.

Gracias por adelantado.

Lucas
18 de Enero del 2005
Tienes dos opciones.
1. Dejar que el contenedor te gesione el foco. Para ello, normalmente el orden en el que añades los componentes al contenedor (panel) es el orden que sigue el foco.
2. Implementarte un gestor de foco.

import java.awt.*;
import java.util.*;

public class GestionFoco extends FocusTraversalPolicy
{
private Hashtable siguientes = new Hashtable();
private Hashtable anteriores = new Hashtable();
private Component firstComponent = null;

public void setFirstComponent(Component component)
{
firstComponent = component;
}
public Component getFirstComponent()
{
return firstComponent;
}
public Component getComponentAfter(Container focusCycleRoot, Component aComponent)
{
boolean bFind = false;
Component component = aComponent;
while (!bFind)
{
component = (Component)siguientes.get(component);
if ((component == null) || component.isEnabled())
bFind = true;
}

return component;
}
public Component getComponentBefore(Container focusCycleRoot, Component aComponent)
{
boolean bFind = false;
Component component = aComponent;
while (!bFind)
{
component = (Component)anteriores.get(component);
if ((component == null) || component.isEnabled())
bFind = true;
}

return component;
}
public Component getDefaultComponent(Container focusCycleRoot)
{
return null;
}
public Component getFirstComponent(Container focusCycleRoot)
{
return getFirstComponent();
}
public Component getInitialComponent(Window window)
{
return getFirstComponent();
}
public Component getLastComponent(Container focusCycleRoot)
{
return null;
}
public void setComponentAfter(Component aComponent1, Component aComponent2)
{
if (aComponent1==null || aComponent2==null)
return;

//Lista de siguientes
if (siguientes.containsKey(aComponent1))
siguientes.remove(aComponent1);
siguientes.put(aComponent1, aComponent2);

//Lista de anteriores
if (anteriores.containsKey(aComponent2))
anteriores.remove(aComponent2);

anteriores.put(aComponent2, aComponent1);
}

/**
* Establecer el orden para cuando se quiere hacer una navegacion rapida entre algunos componentes
* @param aComponent: componente origen
* @param aComponentBefore: componente anterior
* @param aComponentAfter: componente posterior
*/
public void setQuickNavigation(Component aComponent, Component aComponentBefore, Component aComponentAfter)
{
if (aComponent==null)
return;

//Lista de siguientes
if (siguientes.containsKey(aComponent))
siguientes.remove(aComponent);
if (aComponentAfter!=null)
siguientes.put(aComponent, aComponentAfter);

//Lista de anteriores
if (anteriores.containsKey(aComponent))
anteriores.remove(aComponent);
if (aComponentBefore!=null)
anteriores.put(aComponent, aComponentBefore);
}
}

Y utilizarlo en el panel

private GestionFoco focusPolicy_ = new GestionFoco();

this.setFocusCycleRoot(true);
this.setFocusTraversalPolicy(focusPolicy_);

focusPolicy_.setFirstComponent(jText1);
focusPolicy_.setComponentAfter(jText1, jText2);
...