Das Büro
  Nachdem es dem Kunden möglich ist, Videos auszuleihen, wird es Zeit den Manager einzuführen. Dieser benötigt für seine Arbeit ein Büro. Am wichtigsten ist, für den Manager eine Möglichkeit zu schaffen, das Büro und den Shop wieder zu verlassen. Dies geschieht ähnlich wie beim Counter durch Buttons im Standard-FormSheetsp apilogo. Zur Erstellung dieses FormSheetssp apilogo wird auch hier der FormSheetContentCreatorsp apilogo verwendet.  
   neue Javaklasse    DefaultOfficeFormCreator.java  
 

  import sale.*;
  
  public class DefaultOfficeFormCreator extends FormSheetContentCreator
  {
  }
        
 
  Diese Klasse benötigt einen Konstruktor. Als Parameter wird dort das Office übergeben, zu dem der DefaultOfficeFormCreator gehört:  
 

  public DefaultOfficeFormCreator(Office officeOwner) 
  {
    super();
    this.officeOwner = officeOwner;
  }      
        
 
  Die Variable officeOwner muß vor dem Konstruktor deklariert werden:  
 

  private Office officeOwner;
        
 
  Außerdem muß wie schon so oft die Methode createFormSheetContentsp apilogo implementiert werden:  
 

  public void createFormSheetContent(FormSheet fsToCreate)
  {
  }
        
 
  Dann werden alle eventuell vorhandenen Buttons entfernt und der Button zum Schließen des Office eingebaut. In der doActionsp apilogo-Methode der zum Button gehörenden Aktion wird einfach die quitsp apilogo-Methode aufgerufen.  
 
    
  fsToCreate.removeAllButtons();
  fsToCreate.addButton("Close", 1, new sale.Action() 
  {
    public void doAction(SaleProcess p, SalesPoint sp) 
    {
      officeOwner.quit();
    }
  });
        
 
  Im folgenden soll die noch leere Fläche über dem Button gefüllt werden.  
  Zunächst wird jedoch eine import-Anweisung eingefügt, um die zu verwendenden Swing-Klassen dem Compiler bekannt zu machen:  
 

  import javax.swing.*;
        
 
  Um die gewünschten Daten im FormSheetsp apilogo anzeigen zu können, wird in der Methode createFormSheetContent noch vor der Erzeugung des Buttons ein JPanel erstellt, auf dem die Daten als JLabel plaziert werden können. An diesem wird ein vertikales BoxLayout eingestellt, d.h. die eingefügten Komponenten erscheinen untereinander.  
 

  JPanel jpFSComponent = new JPanel();
  jpFSComponent.setLayout(new BoxLayout(jpFSComponent, BoxLayout.Y_AXIS));
        
 
  Nun kann das Label mit der aktuellen Zeit in das Panel eingefügt werden. Es wird zunächst der aktuelle Shopsp apilogo ermittelt und von diesem das verwendete Timersp apilogo-Objekt geholt.  
  Objekte, die das Timersp apilogo-Interface implementieren, sind in der Lage, das Zeitmanagement eines Shopssp apilogo zu übernehmen. Standardmäßig wird vom Shopsp apilogo ein StepTimersp apilogo verwendet, der die Zeit nur dann weiterzählt, wenn seine goAheadsp apilogo-Methode aufgerufen wird. Ein zweiter im Framework schon implementierter Timersp apilogo ist der AutoTimersp apilogo. An ihm kann ein Zeitintervall eingestellt werden, nach dem die Zeit weitergezählt werden soll. Der zu verwendende Timersp apilogo kann am Shopsp apilogo über setTimersp apilogo gesetzt werden.  
  Timersp apilogo sollten immer so implementiert werden, daß sie mit Objekten zusammenarbeiten, die das Timersp apilogo-Interface implementieren. Ein derartiges Timesp apilogo-Objekt sollte dem Konstruktor des Timerssp apilogo bei der Erzeugung übergeben werden können. Auf diese Weise ist es möglich, mit einem Timersp apilogo verschiedene Zeitformate zu verwenden. Mit dem Framework werden bereits zwei Formate bereitgestellt: Stepsp apilogo benutzt eine einfache Variable vom Typ long, um die Zeit festzuhalten. Dies ist das von Shopsp apilogo standardmäßig verwendete Format. Außerdem steht die Klasse Datesp apilogo zur Verfügung. Ein Objekt dieser Klasse verwaltet ein Datum mit je zwei Stellen für Tag, Monat und Jahr.  
  In einem Paar aus Timersp apilogo und Timesp apilogo ist das Timesp apilogo-Objekt verantwortlich für das Speichern der Zeit und (auf Anforderung) für das Weiterzählen um ein gewünschtes Intervall. In der Verantwortlichkeit des Timersp apilogo-Objektes liegt es, festzulegen, wann und um welches Intervall die Zeit weiterzuschalten ist.  
  Vom am Shopsp apilogo geholten Timersp apilogo-Objekt wird mit getTimesp apilogo die aktuelle Zeit geholt, mit einem Kommentar verknüpft und dem Label übergeben:  
 

  jpFSComponent.add(new JLabel(
    "Turn: " + Shop.getTheShop().getTimer().getTime()));    
        
 
  Als nächstes soll das noch vorhandene Geld angezeigt werden. Dazu muß zunächst der Stocksp apilogo geholt werden, der den Münzschacht des Videoverleihs darstellt. Das Interface Stocksp apilogo ist im Paket datasp apilogo definiert, das also importiert werden muß:  
 

  import data.*;  
        
 
  Nun kann der Stocksp apilogo ermittelt werden:  
 

  Stock coinSlot = Shop.getTheShop().getStock("coin slot");  
        
 
  Um die Summe in einen korrekt formatierten Geldbetrag umwandeln zu können, wird noch die vom Shopsp apilogo verwendete Währung benötigt:  
 

  Currency currency = (Currency)Shop.getTheShop().getCatalog("DM");  
        
 
  Nun wird mit Hilfe des Datenkorbes die Methode sumStocksp apilogo auf den Geldbestand angewendet. Diesem wird außerdem ein CatalogItemValuesp apilogo und ein Initialwert übergeben.  
  Die Klasse CatalogItemValuesp apilogo wird verwendet, um den Wert des CatalogItemsp apilogo festzustellen. In der Standardimplementation ruft ihre getValuesp apilogo-Methode einfach die getValuesp apilogo-Methode des CatalogItemssp apilogo auf und gibt den erhaltenen Wert weiter. Wird ein anderer Wert gewüscht, muß eine angepaßte Unterklasse von CatalogItemsp apilogo verwendet werden. Dies ist hier jedoch nicht der Fall.  
 

  IntegerValue money =
    (IntegerValue)coinSlot.sumStock(db, new CatalogItemValue(),
                                    new IntegerValue(0));
        
 
  Der durch die Aufsummierung erhaltene Wert muß korrekt formatiert werden. Dazu wird die toStringsp apilogo-Methode der verwendeten Währung benutzt.  
  Der so aufgebaute String wird noch mit einem Kommentar versehen und an das JLabel übergeben.  
 

  jpFSComponent.add(new JLabel("Money: " +
                               currency.toString(money)));
        
 
  Nun muß das JPanel noch am FormSheetsp apilogo als zu verwendende Komponente gesetzt werden, dazu wird die Methode setComponent verwendet.  
 

  fsToCreate.setComponent(jpFSComponent);
        
 
  Die Vorbereitungen für das Büro sind abgeschlossen und die Klasse Office kann nun implementiert werden.  
   neue Javaklasse    Office.java  
  Die Klasse Office implementiert das Büro. Hier kann der Manager das Logfile einsehen, den Automaten mit neuen Videos füllen oder Videos aus dem Bestand nehmen. Zuerst wird die Klasse mit ihrem Konstruktor wie folgt erstellt:  
 

  import sale.*;
  import sale.stdforms.*;

  public class Office extends SalesPoint
  {
    public Office(String name)
    {
      super(name);
    }
  }           
        
 
  Der Konstruktor ruft, wie der Konstruktor von Counter, einfach den Konstruktor von SalesPointsp apilogo auf und übergibt den Namen des Office an ihn.  
  Das Office soll mit dem gerade erstellten DefaultOfficeFormCreator aufgebaut werden. Es wird eine Methode implementiert, die das FormSheetsp apilogo für das Büro zurückgibt:  
 

  public FormSheet getDefaultFormSheet()
  {
    return new FormSheet("Office",
                         new DefaultOfficeFormCreator(this), false);
  }
        
 
  Außerdem wird in dieser Klasse das Passwort des Managers in der Variable password verwaltet. Diese wird wie folgt deklariert:  
 

  private static String password;    
        
 
  Da die Variable als private deklariert wurde, kann man nicht ohne weiteres von außen auf sie zugreifen. Daher werden zwei weitere Methoden benötigt: eine zum Ändern des Paßworts (setPassword) und eine zum Überprüfen des Paßworts (testPassword).  
 

  public static void setPassword(String password)
  {
    Office.password = password;
  }

  public static boolean testPassword(String password)
  {
    return password.equals(Office.password);
  }    
        
 
 Quelltexte
  Hier der Quelltext der in diesem Kapitel geänderten Klassen:  
 
vorherige Seite  Die Rückgabe des Videos Der Manager  naechste Seite
 

by kk15

Valid HTML 4.01!