Java-Actions #
Das Action-Interface ist eigentlich eine recht gute Grundidee. Eine von einem Programm ausführbare Funktion wird abstrahiert als Action verpackt und kann dann z.B. einem Button und/oder einem Menü zugeordnet werden. Leider reicht die Implementation der Standard-Klassen vorne und hinten nicht aus, um komfortabel zu arbeiten.
Was sind Actions #
Eine Action abstrahiert so etwas wie eine Menüfunktion. Diese Action kann dann z.B. als Menüpunkt in ein Menü oder ein Popupmenü eingefügt werden oder als Button in eine Toolbar. Idealerweise sollte dabei ein und dieselbe Action an mehreren Stellen des Programms benutzt werden können. Ebenso idealerweise sollten Actions aktiviert und deaktiviert werden, so daß ein Menüpunkt "eingegraut" wird, wenn die zugehörige Action gerade nicht ausführbar ist. Eine schöne Einführung in das Thema gibt es im Java-Tutorial How to use Actions?.
Was fehlt? #
Meiner Meinung nach fehlt es an einem Framework, um Actions anständig zu verwalten. Hierzu ein paar Gedanken:
Ich möchte Gruppen von Actions haben, die ich z.B. fertig als Menübaum oder als Toolbar vorkonfigurieren kann. In solch einem Baum muss man auf einzelne Actions zugreifen können, man muss Actions nachträglich an die richtige Stelle einfügen können, etc.
Es fehlen natürlich auch fertige Methoden, um aus einer Gruppe Actions dann auch wirklich GUI-Elemente wie Menüs, Toolbars oder Popups zu erzeugen.
Man sollte solche Gruppen von Actions kombinieren können. D.h. ich habe ein Fenster, das ein Menü mit Punkten wie "Ende", "Neues Dokument" enthält. Öffne ich nun ein Dokument, so ergeben sich hieraus zusätzliche Actions, die dann quasi als Plugin in das vorhandene Menü bzw. die Toolbar eingearbeitet werden. Wird das Fenster wieder geschlossen, verschwindet ds Plugin wieder.
Es gibt auch einige interessante Ansätze zur Konfiguration von Actions. Das SAF arbeitet mit Annotations für die Grundlagen und mit Properties-Dateien für Werte wie Menütext, Icon, etc. Man kann nicht ohne diese Properties-Datei arbeiten, was ich etwas lästig finde. SAM arbeitet mit einer XML-Datei und alternativ mit Java-Befehlen (also ganz von Hand). Meine persönliche Meinung ist, daß solche Daten immer mit in den Code gehören, mit dem sie sich beschäftigen, also wäre ich eher für Annotations. Dabei wäre eine Überladung durch Properties z.B. zur Lokalisierung jedoch durchaus wünschenswert.
Eine Action ist nach meinem Verständnis eigentlich immer eine auszuführende Funktion oder Methode. Dafür ist die vorhandene Klassen-Schnittstelle eigentlich nicht ideal. Ich fände einen Mechanismus zur Abbildung auf eine Methode wünschenswert, ohne daß man für jede Action eine eigene Klasse definieren muss (das gelingt z.B. im SAF durch annotierte Methoden, aus denen automatisch Actions generiert werden).
Welche Bibliotheken können helfen? #
- Swing Applications Framework - Wird von Netbeans unterstützt; soll in Java 7 integriert werden
- Swing Actions Manager - Sehr gut durchdachtes Framework, keine sichtbare Community
- Artikel über "XML-Actions" - lesenswerter Artikel, dessen Code angeblich in die SwingLabs Actions eingeflossen ist
- SwingLabs Actions - Weiterentwicklung des obigen Artikels, die es leider nicht bis ins SAF geschafft hat, auch keine sichtbare Community
- JIDE Actions Framework - eine proprietäre Lösung, die immer mal wieder genannt wird und nicht schlecht sein soll
- GUI Commands - scheint alle Probleme zu lösen, ist in der aktuellen Version aber proprietär und es ist nicht ersichtlich, daß jemand die freie Version weiterpflegt
- http://xul.sourceforge.net/ XUL sollte auch nicht vergessen werden.
SAM ist scheinbar sehr gut durchdacht. Vor allem habe ich nach dem Lesen des Tutorials den Eindruck, daß jede Komponente für sich sinnvoll durchdacht ist aber auch ersetzt oder erweitert werden kann. Es geht davon aus, daß man seine Actions als XML-Datei(en) oder als Java-Code definiert. Einen Generator, der stattdessen Annotations benutzt, sollte leicht zu schreiben sein. Die letzten Schreibzugriffe ins CVS sind leider ca. 2 Jahre alt und eine Mailingliste o.ä. gibt es nicht. Der Autor ist allerdings recht hilfsbereit und hat mich im übrigen auch auf sein https://eventbus.dev.java.net/ hingewiesen, das eine interessante Ergänzung ist, um die durch Actions erzeugten Events besser zuzustellen.
SwingLab ist ein Platz, von dem aus schon manche Neuerung in die offiziellen Java-Bibliotheken eingeflossen sind. Allerdings hat es das Actions-Framework anders als das SAF (zu dem es IMO essentiell dazugehören würde) bisher nicht geschafft. Nach den Tutorials erscheint es mir auch nicht so durchdacht wie SAM. Es besteht aus einer XML-Datei und einer Resource-Datei, um Actions zu deklarieren (und ich habe lieber immer nur eine Stelle, an der Code steht, der sich mit einem Problem beschäftigt). Es hat nach meiner Lesung keine so einfache Vorstellung einer Gruppe von Actions. Es erlaubt keine dynamische Anpassung z.B. durch Plugins oder einen Kontext-Wechsel.
Obwohl es sich bei XUL nicht um einen Swing-spezifischen Ansatz handelt, gibt es dennoch einige Swing-Implementationen, die wahrscheinlich auch zum Thema Actions was zu sagen haben. Vielleicht sollte man da auch mal reinschauen.
Aufruf #
Will jemand bei der Suche nach dem idealen Framework bzw. beim Erstellen desselben mitmachen?!?
Nachdem ich jetzt einiges recherchiert und gelesen habe, wäre mein Ansatz, SAM als Basis zu nehmen und da ein bissschen dran weiterzuarbeiten. Aber für andere Ideen bin ich auch offen. -- ThomasBayen