...
Für die nachfolgend beschriebene Identifizierung der Swing-Komponenten, kann der verwendete AccessibleName aus den Property Dateien des Action & Command Framework ausgelesen werden. In der actions.properties
Datei wird der name Name einer Action spezifiziert. Der dort verwendete Name der Action wird über die jadice implementation zu einem AccessibleName überführt. Anhand des Action Name bzw. des AccessibleName kann bei der Traversierung der Swing-Komponenten-Hierarchie die gesuchte Komponente identifiziert werden.
Beispiel: Nachfolgend ein ein auschnitt einer actions.properties
Datei, bei der der Action Name "Document drucken"(Zeile: 2) ausgelesen werden kann.
Codeblock | |||||||||
---|---|---|---|---|---|---|---|---|---|
| |||||||||
Print.commands = Print Print.Name //= StoreDokument adrucken listPrint.ShortDescription of= referencesDruckt todas theaktuelle swing components List<AtomicReference<Component>> result = new ArrayList<>(); // Accessible names we want to look for in the hierarchy String[] strings = { Dokument Print.SmallIcon = defaulticons.TB_PRINT |
Der Action Name, bzw. Accessible Name kann wiederum im nachfolgend Dargestellten "Erstellung der Policy anhand der Action Names" verwendet werden.
Beispiel:
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", "Linie"
};
// 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); |
AccessibleName aus dem Annotation Profil
...
Im Beispiel "Erstellung der Policy anhand der Action Names" wird gezeigt wie durch das hinzufügen der Accessible Names in das String Array, die Fokusreihenfolge definiert werden kann. Die dort definierte Reihenfolge wird entspricht der Reihenfolge mit der die Swing-Komponenten den Fokus erhalten.
AccessibleName aus dem Annotation Profil
Im falle der AnnotationsToolbar, die dynamisch anhand des verwendeten annotation profile erstellt wird, kann der AccessibleName aus dem annoprofil ausgelesen werden.
Hierfür muss der Wert ... als AccessibleName verwendet werden.
...
Integrationsmöglichkeit der eigenen Focus Traversal Policy
...
Um eine FocusTraversalPolicy zu setzen muss man nur die Policy auf der gewünschten Komponente setzen.
Möglichkeiten und Grenzen
Zuvor wurde die Vorgehensweise beschrieben, bei der Anhand des AccessibleNames Komponenten, während der Traversierung der Swing-Komponenten-Hierarchie, aufgefunden und für eine FocusTraversalPolicy verwendet werden können.
...
Overlays (ThumbnailView, Annotations Editoren)
Die Annotationseditoren, das GalleryNavigationTool und die RolloutSearch unterstützen die in diesem Artikel Konzepte für die Tastaturbedienbarkeit momentan nicht.
Fehlende AccessibleNames
Wenn eine Swing/AWT Komponente keinen AccesibleContext oder AccessibleName vergeben hat, kann dies die Identifizierung eines entsprechenden Elements in dem Ansatz mit der Traversierung erschweren. In diesem Fall müssen wahlweise andere Eigenschaften einer Komponente vergeben werden, die diese in dem Hierarchiebaum eindeutig identifizierbar machen oder aber auf den Ansatz mit dem Halten von Referenzen auf die Objekte ohne Traversierung ausgewichen werden.
Externe Frames
Bei einer komplexen Anwendung kommt es häufig dazu, dass ein sekundärer Dialog oder Frame zum Einsatz kommt. Da dieses Frame oder dieser Dialog nicht Teil der Hierarche des Hauptfensters ist muss dieses ebenfalls eine eigene Policy mitbringen, die den Fokus steuert. Wichtig ist dabei auch den Übergang zwischen den Frames zu beachten. Soll beispielsweise dem neuen Fenster Focus gegeben werden muss man mit requestFocus()
und gegebenenfalls toFront()
im Voraus aufgerufen werden um das Fenster in den Vordergrund zu rücken. Ob ein Fenster den Fokus bekommt kann jedoch je nach Betriebssystem anders gehandhabt werden und die Priorität des Fensters spielt ebenfalls eine Rolle.
Hierarchie Listener
Bei manchen Swing/AWT basierten Anwendungen kann es zu einer Änderung der Swing-Hierarchie kommen. Wird eine FocusTraversalPolicy verwendet, muss diese auf derartige Änderungen eventuell reagieren müssen je nach Anwendungsfall. Diesem Effekt kann mit einem HierarchyListener (siehe https://docs.oracle.com/javase/8/docs/api/java/awt/event/HierarchyListener.html) begegnet werden.
...