Der Manager
  Der Manager hat im Gegensatz zum Kunden ein Passwort, mit dem er sich im Büro anmelden kann. Er benötigt somit auch einen eigenen Menüpunkt zum Einloggen.  
  Zunächst muß der Manager sein Passwort erhalten, über das er sich beim späteren Einloggen authentifizieren kann. Dazu wird ein MessageDialog verwendet. Ein derartiger Dialog wird von JOptionPane.showMessageDialog zurückgegeben. Der Methode wird u.a. die darzustellende Meldung als Parameter übergeben. Dies ist im einfachsten Fall ein String. Es kann sich dabei aber auch um eine Komponente handeln, die dann anstatt der Message gezeichnet wird. Von dieser Möglichkeit soll hier Gebrauch gemacht werden, um einen Dialog aufzubauen, in dem das Paßwort festgelegt wird. Dazu werden zunächst zwei Paßwortfelder angelegt, eines zum Festlegen des Paßwortes, das andere zur Kontrolle. Für derartige Felder stellt das Swing-Paket die Klasse JPasswordField zur Verfügung. Sie ist von JTextField abgeleitet und stellt wie dieses eine Eingabezeile zur Verfügung. Im Unterschied zu JTextField werden jedoch bei JPasswordField die eingegebenen Buchstaben nicht angezeigt. Außerdem ist es nicht möglich, etwas aus dem Feld herauszukopieren und an einer anderen Stelle einzufügen, um auf diese Weise den Text doch noch sichtbar zu machen.  
  Um auf Klassen aus Swing zugreifen zu können, muß im Kopf der Klasse VideoMachine eine import-Anweisung eingefügt werden:  
   neue Javaklasse    VideoMachine.java  
 

  import javax.swing.*;
        
 
  Die Felder werden nun folgendermaßen in der main-Methode von VideoMachine direkt unter dem Anlegen des Counter (nach vidMachine.addSalesPoint(c);) angelegt:  
 

  JPasswordField jPasswordField1 = new JPasswordField();
  JPasswordField jPasswordField2 = new JPasswordField();
        
 
  Für eine kompakte Darstellung müssen diese Felder in in eine Komponente verpackt werden. Dazu wird ein neues JPanel mit vertikalem BoxLayout erzeugt.  
 

  JPanel jPasswordRequest = new JPanel();
  jPasswordRequest.setLayout(
    new BoxLayout(jPasswordRequest, BoxLayout.Y_AXIS));
        
 
  Nun werden in das Panel zwei JLabel, die die Eingabeaufforderungen enthalten, und die Paßwortfelder eingebaut.  
 

  jPasswordRequest.add(new JLabel("Enter manager's password:"));
  jPasswordRequest.add(jPasswordField1);
  jPasswordRequest.add(new JLabel("Re-enter manager's password:"));
  jPasswordRequest.add(jPasswordField2);
        
 
  In einer Schleife wird nun solange das Paßwort abgefragt, bis die Eingabe im ersten und zweiten Feld übereinstimmen:  
 

  do {
    JOptionPane.showMessageDialog(null, 
                                  jPasswordRequest,
                                  "Manager",
                                  JOptionPane.QUESTION_MESSAGE);
  } while (!new String(jPasswordField1.getPassword()).equals(
              new String(jPasswordField2.getPassword())));
        
 
  Wurde das Passwort erfolgreich eingegben, muß es als nächstes abgespeichert werden:  
 

  Office.setPassword(new String(jPasswordField1.getPassword()));
        
 
  Die Möglichkeiten des Büros sollen nun genutzt werden können. Um das Büro betreten zu können, ist es notwendig, daß die Menüleiste des Hauptfensters angepasst wird.  
  Das Shopsp apilogo-Menü wird in der Methode createShopMenuSheet der Klasse Shopsp apilogo erzeugt. Diese muß also überschrieben werden. Es wird daher wie folgt unter die main-Methode von VideoMachine die Methode createShopMenuSheet eingefügt:  
 

  public MenuSheet createShopMenuSheet()
  {
  }
        
 
  Diese Methode gibt eine Instanz der Klasse MenuSheetsp apilogo zurück. MenuSheetssp apilogo repräsentieren Menüs unabhängig von deren späterem Aussehen. Das heißt, der Programmierer kann zwar die Struktur des Menüs beeinflussen, kann Menüpunkte anlegen oder löschen; er hat jedoch nicht die Möglichkeit, das Aussehen zu beeinflussen. Auf diese Weise ist es z.B. möglich, je nach Bedarf ein Menü mal als Menüleiste mit mehreren Menüs darzustellen, ein anderes Mal als echtes Menü mit mehreren Untermenüs.  
  Um das Menüsystem des Programms zu ändern, wird in der eben angelegten Methode mit Hilfe der Oberklasse die alte Menüleiste erzeugt und gespeichert:  
 

  MenuSheet msMenuBar = super.createShopMenuSheet();  
        
 
  Diese hat zwei Einträge: das "Shop"-Menü und das "MultiWindow"-Menü. Letzteres interessiert in dieser Anwendung nicht, daher wird nun das "Shop"-Menü ermittelt und in einer eigenen Variablen gespeichert:  
 

  MenuSheet msShopMenu =
    (MenuSheet)msMenuBar.getTaggedItem(SHOP_MENU_TAG, true);
        
 
  Die Methode getTaggedItemsp apilogo sucht einen Menüeintrag anhand seines Tags, d.h. einer Marke, aus allen Menüeinträgen heraus. Es wird aus der Menüleiste des Programms der Eintrag mit dem Tag SHOP_MENU_TAGsp apilogo herausgesucht. Für jeden Menüpunkt des Shopsp apilogo-Menüs und der Menüleiste ist in der Klasse Shopsp apilogo ein Tag vorgegeben, so daß jeder Eintrag der Struktur direkt angesprochen werden kann. Die Tags für das "MultiWindow"-Menü sind in der Klasse MultiWindowsp apilogo festgelegt. Der Parameter true bewirkt, daß nur im angegebenen Menü, hier also in der Menüleiste, und nicht in Untermenüs gesucht wird.  
  Als nächstes sind alle Menüeinträge unterhalb des ersten Separators zu entfernen. Dort soll der Eintrag eingefügt werden, mit dem der Manager das Büro betreten kann. Da die Einträge später wieder angehängt werden sollen, werden sie vorübergehend in eigenen Variablen gespeichert.  
 

  MenuSheetItem msLoadItem =
    (MenuSheetItem)msShopMenu.remove(LOAD_TAG);
  MenuSheetItem msSaveItem =
    (MenuSheetItem)msShopMenu.remove(SAVE_TAG);
  MenuSheetSeparator msSeparator =
    (MenuSheetSeparator)msShopMenu.remove(SEPARATOR_TWO_TAG);
  MenuSheetItem msQuitItem =
    (MenuSheetItem)msShopMenu.remove(QUIT_SHOP_TAG);
        
 
  Normale Menüeinträge, bei deren Auswahl eine Aktion ausgelöst wird, sind im Framework in der Klasse MenuSheetItemsp apilogo implementiert. Dem Konstruktor eines derartigen Menüeintrags muß der Name des Eintrags, wenn gewünscht ein Tag, und die auszuführende Aktion übergeben werden. Wie schon bekannt, wird die Methode doActionsp apilogo aus dem Interface Actionsp apilogo implementiert. Um also einen Menüeintrag zu erzeugen, wird folgender Code benötigt:  
 

  MenuSheetItem msManagerItem = new MenuSheetItem("Open Office",
    new sale.Action()
    {
      public void doAction(SaleProcess p, SalesPoint sp)
      {
      }
    });
        
 
  Was soll nun geschehen, wenn ein Menüeintrag ausgewählt wird? Zunächst muß festgestellt werden, ob es schon ein Office in der Liste aller SalesPointssp apilogo gibt. Ist dies der Fall, ist schon ein Manager beim Programm angemeldet, und keine weitere Person ist berechtigt, sich als Manager einzuloggen. Gibt es noch kein Büro, muß sich der Manager per Passwort authentifizieren. Erst wenn dieses Paßwort mit dem abgespeicherten Paßwort übereinstimmt, wird ein neues Büro erzeugt, das der Manager dann betreten kann. Ist das Paßwort nicht korrekt, wird das Betreten des Büros verweigert.  
  Die doAction-Methode wird also um folgende Zeilen erweitert:  
 

  List l = getSalesPoints();
  for (int i = 0; i < l.size(); i++) {
    if (((SalesPoint)l.get(i)).getName() == "Office") {
      JOptionPane.showMessageDialog(null, 
	                            "There is already an Office",
                                    "Error",
                                    JOptionPane.ERROR_MESSAGE);
      return;
    }
  }

  JPasswordField jPasswordField = new JPasswordField();
  JPanel jPasswordRequest       = new JPanel();
  jPasswordRequest.setLayout(
    new BoxLayout(jPasswordRequest, BoxLayout.Y_AXIS));
  jPasswordRequest.add(
    new JLabel("Enter the manager's password:"));
  jPasswordRequest.add(jPasswordField);
  JOptionPane.showMessageDialog(null,
                                jPasswordRequest,
                                "Manager",
                                JOptionPane.QUESTION_MESSAGE);

  if (Office.testPassword(
        new String(jPasswordField.getPassword()))) {
    Office o = new Office("Office");
    o.attach(new DataBasketImpl());
    o.attach(new User("Manager"));
    Shop.getTheShop().addSalesPoint(o);
  }
  else {
    JOptionPane.showMessageDialog(null,
                                  "Access denied!");
  }
        
 
  Die doAction-Methode ist damit fertig implementiert. Nun müssen nur noch die vorhin gespeicherten Menüeinträge und der eben erzeugte Eintrag in richtiger Reihenfolge in das Menü einsortiert werden. Am Ende der createShopMenuSheet-Methode wird dies wie folgt realisiert:  
 

  MenuSheetSeparator msSeparator2 = new MenuSheetSeparator();
  msShopMenu.add(msManagerItem);
  msShopMenu.add(msSeparator2);
  msShopMenu.add(msLoadItem);
  msShopMenu.add(msSaveItem);
  msShopMenu.add(msSeparator);
  msShopMenu.add(msQuitItem);

  return msMenuBar;
        
 
 Quelltexte
  Hier der Quelltext der in diesem Kapitel geänderten Klassen:  
 
vorherige Seite  Das Büro Zeit weiterschalten und Logfile einsehen  naechste Seite
 

by kk15

Valid HTML 4.01!