Swing FocusTraversalPolicy dreht sich im Kreis

Paddius

Mitglied
Hallo,

ich habe aus diesem Beispiel die FocusTraversalPolicy übernommen, um eine andere Tab-Reifenfolge zu erreichen, als normal durch die LayoutFocusTraversalPolicy festgelegt wäre.

Ich besitze ein Fenster, auf welchem im zwei JPanels übereinander angeordnet sind. Auf dem oberen JPanel habe ich von links nach rechts ein Textfeld, eine Combobox und einen Button. Nun hätte ich gerne, dass nach Betätigen von TAB im Textfeld, der Focus aus diesem JPanel springt und folglich ins untere JPanel springt. Mit der Standard-Policy ist dies der Fall, nachdem ich auf dem Button die TAB-Taste drücke.

Java:
public class CustomFocusTraversalPolicy
        extends FocusTraversalPolicy {

    List<Component> order;

    public CustomFocusTraversalPolicy(List<Component> order) {
        this.order = new ArrayList<Component>(order.size());
        this.order.addAll(order);
    }

    @Override
    public Component getComponentAfter(Container focusCycleRoot,
            Component aComponent) {
        int idx = (order.indexOf(aComponent) + 1) % order.size();
        return order.get(idx);
    }

    @Override
    public Component getComponentBefore(Container focusCycleRoot,
            Component aComponent) {
        int idx = order.indexOf(aComponent) - 1;
        if (idx < 0) {
            idx = order.size() - 1;
        }
        return order.get(idx);
    }

    @Override
    public Component getDefaultComponent(Container focusCycleRoot) {
        return order.get(0);
    }

    @Override
    public Component getLastComponent(Container focusCycleRoot) {
        return order.get(order.size()-1);
    }

    @Override
    public Component getFirstComponent(Container focusCycleRoot) {
        return order.get(0);
    }
}

Ich habe nun also diese Klasse implementiert und die folgende Liste erstellt {ComboBox, Button, Textfeld}, in der Hoffnung, dass nun nach dem Textfeld aus dem JPanel gesprungen wird und mit der TAB-Reihenfolge des JFrames weitergemacht wird. Leider tabbe ich aber nun zyklisch im Kreis, also ComboBox -> Button -> Textfeld -> ComboBox.

Ich hatte schon versucht, bei
Code:
getComponentAfter()
zu überprüfen, ob die nächste Komponente wieder die erste wäre und dann null zurück zu geben, in der Hoffnung, dass der Fokus dann aus dem Panel springt, aber das brachte nicht den erwünschten Erfolg.

Weiß da jemand weiter?

Grüße,
Patrick
 
Hat da niemand eine Idee? Oder ist etwas nicht verständlich? Ich kann gerne versuchen, noch detaillierter auf bestimmte Punkte einzugehen.
 
Du kannst im übergeordneten Fenster, also im Parent deiner beiden Panels, die Methode

Java:
this.setFocusCycleRoot(true);

aufrufen. Somit sollte eine zyklische Reihenfolge der Tab in diesen Parent werden.
Also:

Parent Panel -> ...
Oberes Panel -> ComboBox -> Button -> Textfeld -> ComboBox.
Unteres Panel -> ...

und dann wieder Parent panel.

LG
 

Zurück
Oben