Advanced   Java   Services
Eigene FocusTraversalPolicy
Back Next Up Home


Es ist nicht sehr schwer eine eigene FocusTraversalPolicy zu schreiben. Für die beiden folgenden Beispiele beschreiben wir kurz die Eigenschaften der beiden awt-Policys.

DefaultFocusTraversalPolicy


Bei einem Container mit dieser Policy werden die fokusfähigen Komponenten in der Reihenfolge durchschritten, in der sie in den Container ge-add-et worden sind. Der Container selbst erhält keinen Fokus.


ContainerOrderFocusTraversalPolicy


Bei einem Container mit dieser Policy werden die fokusfähigen Komponenten ebenfalls in der Reihenfolge durchschritten, in der sie in den Container ge-add-et worden sind. Diesmal erhält beim Traversieren jedoch auch der Container am Ende der Komponententraversierung den Fokus. Danach geht der Fokus wieder auf die erste Komponente.


FocusTraversalPolicy und BorderLayout


Die oben angesprochene Regel gilt auch für BorderLayout. Es gibt also keine spezielle Policy für das BorderLlayout, etwa im Uhrzeigersinn und dann ins Zentrum oder ähnliches. Auch hier ist die Reihenfolge des Addens entscheidend.


SkipContainerFocusTraversalPolicy


Interessanterweise funktioniert die DefaultFocusTraversalPolicy nicht mit ScrollBars, die ContainerOrderFocusTraversalPolicy jedoch schon. Die folgende FocusTraversalPolicy ist eine Ableitung von ContainerOrderFocusTraversalPolicy, die das Verhalten von DefaultFocusTraversalPolicy hat und auch für ScrollBars funktioniert:

public class SkipContainerFocusTraversalPolicy extends ContainerOrderFocusTraversalPolicy { Container focusCycleRoot; public SkipContainerFocusTraversalPolicy(Container toSkip) { focusCycleRoot=toSkip; } protected boolean accept(Component com) { return com==focusCycleRoot ? false : super.accept(com); } }

Für ein Panel etwa setzt man die Policy wie folgt ein:

panel.setFocusCycleRoot(true) ; panel.setFocusTraversalPolicy( new SkipContainerFocusTraversalPolicy(panel) ) ;



ReverseOrderDefaultFocusTraversalPolicy


Hier noch ein Beispiel einer Policy das die Richtung des Durchschreitens der Komponenten umdreht.

public class ReverseOrderDefaultFocusTraversalPolicy extends DefaultFocusTraversalPolicy { public Component getComponentAfter(Container focusCycleRoot, Component aComponent) { return super.getComponentBefore(focusCycleRoot, aComponent) ; } public Component getComponentBefore(Container focusCycleRoot, Component aComponent) { return super.getComponentAfter(focusCycleRoot, aComponent) ; } }

Hier kann man natürlich genauso gut von ContainerOrderFocusTraversalPolicy ableiten oder auch von SkipContainerFocusTraversalPolicy.

top Back Next Up Home