Aktionen

Aktion definieren

Damit beim Auswählen von Menus oder beim Drücken von Buttons etwas geschieht, müssen Aktionen definiert und übergeben werden. Da diese Aktionen oftmals einzigartig sind, das heißt es wird selten eine Aktion mehreren Buttons/Menus zugleich zugeordnet, ist es üblich sie direkt im Konstruktor für die Buttons oder Menus zu definieren. Im Beispielcode wurde das bei den Aktionen des Shopmenus so gemacht, die Aktionen des SalesPoints wurden alternativ erst definiert und dann über Variablen an das Menu und den Button übergeben. Letzten Endes entscheidet nur der persönliche Geschmack, für welchen Weg man sich entscheidet.

Beim Konstruktoraufruf von Action sollte man von Beginn an mit new sale.Action() arbeiten. Der Grund ist, dass es im Paket javax.swing auch eine Klasse Action gibt. Werden sowohl javax.swing.*; als auch sale.*; importiert, weiß der Compiler nicht welche Klasse gemeint ist und fordert spätestens dann die ausführliche Schreibweise.

sale.Action ist ein Interface, welches die Implementierung der Methode public void doAction(SaleProcess p, SalesPoint sp) fordert. Über p und sp lässt sich auf den aktuellen Prozess bzw. SalesPoint Bezug nehmen (siehe Beispiel). Wird versucht, in einem SalesPoint Methoden des Prozesses anzusprechen, obwohl gar keiner läuft, kommt es zu einer NullPointerException. Im Menu des Shops gilt dies auch für die Methoden des SalesPoints sp (siehe Beispiel).
import sale.Shop;

public class MainClass {

  public static void main(String[] args) {
    SalesPointApplication spa = new SalesPointApplication();
    Shop.setTheShop(spa);
    spa.start();
  }
}
import sale.*; //Shop, MenuSheet, MenuSheetItem, SaleProcess, SalesPoint
import java.awt.Rectangle;

public class SalesPointApplication extends Shop {

  public SalesPointApplication() {
    super();
  }

  public void quit() {
    if (shutdown (false)) {
      System.exit(0);
    }
  }

  protected MenuSheet createShopMenuSheet() {
    MenuSheet msMenuBar = new MenuSheet("Menuleiste");
    MenuSheet msMenu = new MenuSheet("Menu");
    MenuSheetItem msiAddSalesPoint = new MenuSheetItem("SalesPoint öffnen", new sale.Action() {
      public void doAction(SaleProcess p, SalesPoint sp) {
        MySalesPoint msp = new MySalesPoint("Mein SalesPoint");
        msp.setSalesPointFrameBounds(new Rectangle(100,200,400,300));
        addSalesPoint(msp);
      }
    });
    MenuSheetItem msiProcess = new MenuSheetItem("Prozessname", new sale.Action() {
      public void doAction(SaleProcess p, SalesPoint sp) {
        //wird Exception auslösen, denn im Shop läuft kein Prozess
        System.out.println(p.getName());
      }
    });
    MenuSheetItem msiName = new MenuSheetItem("Name des SalesPoints", new sale.Action() {
      public void doAction(SaleProcess p, SalesPoint sp) {
        //wird Exception auslösen, denn ein Shop ist kein SalesPoint
        System.out.println(sp.getName());
      }
    });
    msMenuBar.add(msMenu);
        msMenu.add(msiAddSalesPoint);
        msMenu.add(msiProcess);
        msMenu.add(msiName);
    return msMenuBar;
  }
}
import sale.*;  //SalesPoint, FormSheet, FormSheetContentCreator,
                //SaleProcess, MenuSheet, MenuSheetItem

public class MySalesPoint extends SalesPoint {

  public MySalesPoint(String name) {
    super(name);
  }

  protected boolean onCanQuit() {
    return getCurrentProcess() == null;
  }

  Action buttonAction = new sale.Action() {
    public void doAction(SaleProcess p, SalesPoint sp) {
      System.out.println(sp.getName());
    }
  };

  Action menuAction = new sale.Action() {
    public void doAction(SaleProcess p, SalesPoint sp) {
      System.out.println(sp.getCurrentProcess());
    }
  };

  protected FormSheet getDefaultFormSheet() {
    return new FormSheet("StandardFormSheet", new FormSheetContentCreator() {
        public void createFormSheetContent(final FormSheet fs) {
          fs.removeAllButtons();
          fs.addButton("Name des SalesPoints", 1, buttonAction);
        }
    }, false);
  }

  protected MenuSheet getDefaultMenuSheet() {
    MenuSheet msMenuBar = new MenuSheet("MenuBar");
    MenuSheet msMenu1 = new MenuSheet("NeuesMenu");
    MenuSheetItem msiItem1 = new MenuSheetItem("Prozessname", menuAction);
    msMenuBar.add(msMenu1);
    msMenu1.add(msiItem1);
    return msMenuBar;
  }
}