!!!Menü per Annotation und Action anwenden

Das Hauptfenster der Anwendung wird nun mit einem Menü ausgestattet. Das LugFramework ist dazu in der Lage Menüs per xml - Datei oder als Annotation zu verarbeiten.
Wenn das Menü mit verschiedene Sprachen verwendet werden soll ist die XML-Datei vorteilhaft.
Ebenso ist eine Benutzerverwaltung die direkten Einfluss auf das Menü hat vorstellbar. In diesem Fall ist ebenfalls die xml - Datei vorteilhaft.

Nun wird das Hauptfenster mit einem Menü über Annotationen gesteuert.

Das Menü wird direkt oberhalb der Klasse eingefügt. Also direkt und ohne Leerzeile über:

  public class FilmverwaltungFenster extends Fenster

Es folgt nun das Menü mit einigen Grundeinträgen:
 @ActionKlasse(xmlDefinition =
     "<action-set>"
  +    "<action-list id=\"menu\">"
  +       "<action-list id    =\"datei\"               name=\"Datei\">"
  +          "<action   idref =\"anwendungBeenden\"    name=\"Anwendung beenden\"  weight=\"10\" />"
  +       "</action-list>"
  //
  +       "<action-list   id   =\"stammdaten\"         name=\"Stammdaten\">"
  +          "<action     idref=\"genreStammdaten\"    name=\"Genre\"              weight=\"10\" />"
  +          "<separator  idref=\"separator\"                                      weight=\"20\" />"
  +          "<action     idref=\"laender\"            name=\"Länder\"             weight=\"30\" />"
  +       "</action-list>"
  //
  +       "<action-list   id   =\"hilfe\"              name=\"Hilfe\">"
  +          "<action     idref=\"ueber\"/>"
  +       "</action-list>"
  +    "</action-list>"
  //
  +    "<action-list id=\"toolbar\">"
  +       "<action   idref=\"anwendungBeenden\"   name=\"Beenden\"                 weight=\"10\" />"
  +       "<action   idref=\"genreStammdaten\"    name=\"Genre\"                   weight=\"20\" />"
  +    "</action-list>"
  + "</action-set>")
  public class FilmverwaltungFenster extends Fenster
  
Eingeleitet wird das Menü durch:

  @ActionKlasse(xmlDefinition =

Durch <action-list wird ein neuer Menüeintrag oben in der Leistenüberschrift eingeleitet.

  +    "<action-list id=\"menu\">"

id legt einen neuen Eintrag an.
Alternativ ergänzt idref ein bereits vorhandenes Menü.
Der erste Parameter \"datei\" ist der eindeutige Begriff der auch als Name der "Action" verwendet werden muss.
Anschließend kann mittels name=\"Datei\" ein lesbarer Name als Bezeichnung eingegeben werden. 
Durch weight= kann die Reihenfolge der Menüeinträge genau angegeben werden. Auch die Reihenfolge der Komponenten in der Toolbar werden über weight gesteuert. In unserem Beispiel fängt 10 ganz links an und arbeitet sich mit steigender Nummerierung immer weiter nach rechts vor.

Ab dem Bereich toolbar werden die Icons in der Toolbar ausgegeben.

  +    "<action-list id=\"toolbar\">"
  
Die Toolbar kann fast alle leichtgewichtigen Swing Kompontenten aufnehmen. Häufig werden außer den typischen Icons auch Buttons, Eingabefelder oder Comboboxen eingesetzt.


Ein Menüeintrag erscheint erst wenn eine entsprechende Action geschrieben wurde.
  @ActionMethode
  ( id = "genreStammdaten",
     actionName = "genreStammdaten",
     accelerator = "ctrl G",
     mnemonic    = KeyEvent.VK_G,
     shortDescription = "Genre Stammdaten bearbeiten",
     iconName = "emotes/face-wink.png"
  )
  public void genreStammdaten() 
  {
     log.info("Genre Stammdaten bearbeiten aufgerufen");
  }

Die id muss mit der id oder der idref in der Menüdefinition (oben) identisch sein. Hierdurch wird der Bezug zwischen der Menübeschreibung und der Action hergestellt.
Der accelerator und mnemonic unterstützen den Schnellaufruf eines Menüeintrages und sind optional. Auch die shortDescription ist optional. Der hier angegebene Text wird ausgegeben wenn die Maus über dem Menüentrag oder dem Toolbareintrag stehen bleibt.
Der iconName muss nur angegeben werden wenn ein Icon vor dem Menüeintrag oder ein Icon in der Toolbarleiste angezeigt werden soll.

Es gibt verschiedene Wege eigene Icons in das Projekt einzubinden. Am leichtesten ist es ein neues Projekt z.B. Names "Icon" anzulegen. In diesem Projekt wird ein neuer Ordner namens icons angelegt. (Bitte den Namen icons verwenden) In diesem Ordner bzw. einer Ordnerstruktur darunter werden die Icons als PNG Datei gespeichert. Wenn dieses Icon-Projekt in das eigene Projekt eingebunden wird stehen die gespeicherten Icons zur Verfügung.

Sehr viele Icons stehen bereits durch die Einbindung des LugFramework zur Verfügung.
In dem LugFramework befinden sich die Datei: 

  /LugFramework/lib/runtime/ivy/oxygen-1.0.14.jar

Diese Datei kann entpackt oder geöffnet werden. Darin sind bereits viele Icons verfügbar und über den Pfad zzgl. Dateinamen innerhalb des Programms einsetzbar.

  iconName = "emotes/face-wink.png"

Durch die Anwendung eigener Icons oder der Icons aus dem LugFramework sind die Standardicons nicht verfügbar.
Diese Problem kann behoben werden wenn in der Applikation, z.B. in main(), bevor launch() aufgerufen wird folgende Zeile einfügt wird:

  IconVerwaltung.addIconQuelle(new IconQuelleClasspath("icons", "small", "large", Anwendung_START.class.getClassLoader())); 

Die Action Methode soll lediglich eine Informationszeile in der Konsole ausgeben.

     log.info("Genre Stammdaten bearbeiten aufgerufen");

Der Maskenaufruf und die Datenbearbeitung folgen gesondert.

Nun folgt die gesamte geänderte Datei: 
  FilmverwaltungFenster.java

 //*************************
 //AUTOR    : Thomas Thießen
 //DATUM    : 12.06.2011
 //ÄNDERUNG : 17.06.2011
 //*************************
  package de.tth.filmverwaltung;
  import java.awt.Image;
  import java.awt.event.KeyEvent;
  import de.bayen.lugframework.ActionKlasse;
  import de.bayen.lugframework.ActionMethode;
  import de.bayen.lugframework.Fenster;
  @ActionKlasse(xmlDefinition =
     "<action-set>"
  +    "<action-list id=\"menu\">"
  +       "<action-list id    =\"datei\"               name=\"Datei\">"
  +          "<action   idref =\"anwendungBeenden\"    name=\"Anwendung beenden\"  weight=\"10\" />"
  +       "</action-list>"
  +       "<action-list   id   =\"stammdaten\"         name=\"Stammdaten\">"
  +          "<action     idref=\"genreStammdaten\"    name=\"Genre\"              weight=\"10\" />"
  +          "<separator  idref=\"separator\"                                      weight=\"20\" />"
  +          "<action     idref=\"laender\"            name=\"Länder\"             weight=\"30\" />"
  +       "</action-list>"
  +       "<action-list   id   =\"hilfe\"              name=\"Hilfe\">"
  +          "<action     idref=\"ueber\"/>"
  +       "</action-list>"
  +    "</action-list>"
  +    "<action-list id=\"toolbar\">"
  +       "<action   idref=\"anwendungBeenden\"   name=\"Beenden\"                 weight=\"10\" />"
  +       "<action   idref=\"genreStammdaten\"    name=\"Genre\"                   weight=\"20\" />"
  +    "</action-list>"
  + "</action-set>")
  public class FilmverwaltungFenster extends Fenster
  {
     public FilmverwaltungFenster(String name, Image image) 
     {
        super(name, image);
     }
     @Override
     protected void hochfahren() 
     {
        super.hochfahren();
     }
     @ActionMethode
     (id = "genreStammdaten",
      actionName = "genreStammdaten",
      accelerator = "ctrl G",
      mnemonic    = KeyEvent.VK_G,
      shortDescription = "Genre Stammdaten bearbeiten",
      iconName = "emotes/face-wink.png"
     )
     public void genreStammdaten() 
     {
        log.info("Genre Stammdaten bearbeiten aufgerufen");
     }
  }