...
Ist der Zugriff auf Swing-Komponenten aufgrund ihrer Sichtbarkeit nicht möglich, machen wir uns eine Eigenschaft der jadice Implementation zunutze. Wir verwenden Informationen, die uns über den AccessibleContext der jeweiligen Komponente bereitgestellt werden. Im Besonderen nutzen wir die über die jadice Implementation sichergestellte Eindeutigkeit des AccessibleName
(In Sonderfällen kann der Accessible Context auch integrationsseitig überschrieben werden). Zu beachten ist dabei, dass der AccessibleName
abhängig vom verwendeten Locale ist.
AccessibleName aus den Action & Command Framework Dateien
...
Codeblock | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
// Store a list of references to the swing components List<AtomicReference<Component>> result = new ArrayList<>(); // Accessible names we want to look for in the hierarchy String[] strings = { "Dokument drucken", "Dokumentinfo", // derived from action.properties "Linie" // derived from default-annotation-profile.xml }; // Get the references from the traversal for (String s : strings) { result.add(walkComponents((Container) root, s)); } // Pass the references as input for the policy FocusTraversalPolicy policy = new HierarchyFocusTraversalPolicy(result); |
...
Im falle der AnnotationsToolbar, die dynamisch anhand des verwendeten annotation profile erstellt wird, kann der AccessibleName aus dem annoprofil ausgelesen werden .
(siehe Codebock "Auszug aus dem default-annotation-profile.xml"). Hierfür muss der Wert ... als des attributes name (@name="Line") als AccessibleName verwendet werden (siehe Zeile 1).
Beispiel:
Notiz an uns selbst, man muss sich noch das Kontext-Menü genauer anschauen, da dort dynamisch anhand des anno-profils das Menü erstellt wird.
Swing Komponenten Hierarchie Traversal
In Swing sind die einzelnen Komponenten in einer Hierarchie, die einer Baumstruktur entspricht, enthalten. Wenn man beispielsweise angefangen beim Wurzelelement der Swing Hierarchie beginnt durch die Elemente zu traversieren, kann man mittels des zuvor erwähnten AccessibleNames alle Elemente in dieser Baumstruktur wiederfinden. Ein Beispiel, wie so etwas angegangen werden kann, wird im Abschnitt "Beispiele" gezeigt. Wir verwenden im Beispiel dabei AtomicReferences (siehe https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html), um später Zugriff auf das Originalobjekt zu erhalten.
Integrationsmöglichkeit der eigenen Focus Traversal Policy
Um eine FocusTraversalPolicy zu setzen muss man nur die Policy auf der gewünschten Komponente setzen.
Codeblock | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<annotation-type name="Line" archetype="Line"
class="com.levigo.jadice.annotation.LineAnnotation">
<renderer toolkit="swing"
class="com.levigo.jadice.annotation.internal.renderer.LineAnnotationRenderer"/>
<wrangler toolkit="swing"
class="com.levigo.jadice.swing.internal.annotation.wranglers.LineAnnotationWrangler"/>
<renderer toolkit="gwt"
class="com.levigo.jadice.web.client.renderer.internal.annotation.LineAnnotationRenderer"/>
<wrangler toolkit="gwt"
class="com.levigo.jadice.web.client.internal.annotation.wrangler.LineAnnotationWrangler"/>
<labels>
<label locale="en">Line</label>
<label locale="de">Linie</label>
<label locale="fr">Ligne</label>
<label locale="it">Linea</label>
</labels>
...
</annotation-type> |
Notiz an uns selbst, man muss sich noch das Kontext-Menü genauer anschauen, da dort dynamisch anhand des anno-profils das Menü erstellt wird.
Swing Komponenten Hierarchie Traversal
In Swing sind die einzelnen Komponenten in einer Hierarchie, die einer Baumstruktur entspricht, enthalten. Wenn man beispielsweise angefangen beim Wurzelelement der Swing Hierarchie beginnt durch die Elemente zu traversieren, kann man mittels des zuvor erwähnten AccessibleNames alle Elemente in dieser Baumstruktur wiederfinden. Ein Beispiel, wie so etwas angegangen werden kann, wird im Abschnitt "Beispiele" gezeigt. Wir verwenden im Beispiel dabei AtomicReferences (siehe https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html), um später Zugriff auf das Originalobjekt zu erhalten.
Integrationsmöglichkeit der eigenen Focus Traversal Policy
Um eine FocusTraversalPolicy zu setzen muss man nur die Policy auf der gewünschten Komponente setzen. Werden in der selben Hierarchie mehrere Komponenten mit einer Policy besetzt, so wird bei einem FocusTraversal diese Policies zunächst ignoriert. Wenn man die Beachtung dieser Policies wünscht so kann man wie in dem gezeigten Beispiel es als PolicyProvider markieren. Dann wird bei einer Suche dessen Policy ebenfalls zur Anwendung kommen, falls diese Komponente zurückgegeben wird bei einer Suche.
Codeblock | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
// create a sample hierarchy with a frame that has a panel which has 2 buttons
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton comp1 = new JButton();
JButton comp2 = new JButton();
frame.add(panel);
panel.add(comp1);
panel.add(comp2);
// set a FocusTraversalPolicy on the root of the hiearchy
frame.setFocusTraversalPolicy(new ExampleTraversalPolicy());
// set a different Policy on the panel. By default it will not be used when the frame has the focus and it receives a focus change
panel.setFocusTraversalPolicy(new ExamplePanelTraversalPolicy());
// by setting it as provider its policy wil
panel.setFocusTraversalPolicyProvider(true); |
Möglichkeiten und Grenzen
...