Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

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
languagejava
titleErstellung der Policy anhand der Action Names
linenumberstrue
collapsetrue
    // 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: 

(Warnung)  Notiz an uns selbst, man muss sich noch das Kontext-Menü genauer anschauen, da dort dynamisch anhand des anno-profils das Menü erstellt wird. (Warnung) 

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
languagexml
titleAuszug aus dem default-annotation-profile.xml
linenumberstrue
collapsetrue
<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>



(Warnung)  Notiz an uns selbst, man muss sich noch das Kontext-Menü genauer anschauen, da dort dynamisch anhand des anno-profils das Menü erstellt wird. (Warnung) 

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
languagejava
titleAnwendungsbeispiel von Policies
linenumberstrue
collapsetrue
    // 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

...