Swinger Commands Projekt

Ein Toolset zur Verwaltung von Java Swing Actions.

Einleitung: ActionCommand und Swing-Action

Zentraler Bestandteil ist die Definition von Commands per Property-Datei. Eine typische Command-Property Datei sieht folgendermaßen aus:

common.ok@id = ok
common.ok@face.text = &Ok
common.ok@face.description = Ok drücken
common.ok@face[menu].text = &Ok
common.ok@face[button].text = &Ok
common.ok@face[toolbar].text =

common.save@id = save
common.save@face.text = &Speichern
common.save@face[toolbar].text =
common.save@face.accelerator = control S
common.save@face.icon = classpath:/de/gluehloch/swinger/icon/save_16.gif
common.save@face.icon_large = classpath:/de/gluehloch/swinger/icon/save_24.gif

common.delete@id = delete
common.delete@face.text = &Löschen
common.delete@face[toolbar].text = 
common.delete@face.icon = classpath:/de/gluehloch/swinger/icon/delete_16.gif
common.delete@face.icon_large = classpath:/de/gluehloch/swinger/icon/delete_24.gif

Im Beispiel definiert alles vor dem @ einen Command-Key. Diesem Command-Key sind verschiedene Eigenschaften zugeordnet.

common.ok@id = ok

Die Eigenschaft id kennzeichnet eine Swing-Kompoenente. Über die Methode java.awt.Component#setName(...) erhält die Komponente die Kennzeichnung.

common.ok@face.text = &Ok
common.ok@face[toolbar].text = Toolbar &Ok

Die Eigenschaft face definiert die Oberflächeneigenschaften des Commands. Ein face ist in die Kategorien [menu], [button] und [toolbar] eingeteilt. In dem Beispiel oben würde ein Command im Toolbar-Einsatz den Text 'Toolbar Ok' anzeigen, während für die restlichen Faces der Text 'Ok' gilt.

Per Default ist id@face[toolbar].text auf null gesetzt. D.h. diese Eigenschaft erbt nicht die Defintion aus face.text.

Weitere Oberflächeneigenschaften sind icon, icon_large und accelerator.

common.delete@face.icon = classpath:/de/gluehloch/swinger/icon/delete_16.gif

Zulässige Resourcen Angaben sind: classpath, file und url.

Im Code angewendet sieht das dann folgendermaßen aus:

CommandLoader.load("commands.properties");
...
ActionCommand actionCommand = new ActionCommand("common.ok") {
    public void execute() {
        // do something...
    }
};

Über die Methoden createMenuItem() und createButton() wird eine Swing Komponente mit Bindung an das ActionCommand hergestellt.

JButton button = actionCommand.createButton();

Gruppenbildung von Commands

Das Prefix group! leitet die Definition einer CommandGroup ein.

group!file-menu@id = file_id
group!file-menu@face.text = &File
group!file-menu@members = common.ok, common.save, common.delete, common.save-as,\
 common.separator, common.exit

Der CommandGroup sind die Member common.ok, common.save, common.delete, common.save-as, separator, common.exit zugeordnet. separator bezieht auf kein ActionCommand, sondern steht hier stellvertretend für eine zu zeichnende Linie zwischen den ActionCommands.

CommandLoader.load("commands.properties");
...
ActionCommand actionCommand = new ActionCommand("common.ok") {
    public void execute() {
        // do something...
    }
};
CommandLoader.bind(okCommand);
// Selbiges mit den restliche ActionCommands!
...
CommandGroup fileGroup = new CommandGroup("file-menu");
CommandBindings.bind(fileGroup);
JMenu fileMenu = fileGroup.createMenu();

Über die Methode CommandBindings#bind() müssen alle ActionCommands und CommandGroups registriert sein.

CommandContainer

CommandContainer cc = new CommandContainer();