|
|
|
|
|
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-FormSheet . Zur
Erstellung dieses FormSheets wird auch
hier der FormSheetContentCreator
verwendet.
|
|
|
Es wird die Klasse DefaultOfficeFormCreator mit
Code gefüllt:
|
|
|
 |  |  |
 |
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 createFormSheetContent 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
doAction -Methode der zum Button
gehörenden Aktion wird einfach die quit -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:
|
|
|
|
|
|
Um die gewünschten Daten im FormSheet 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
Shop ermittelt und von diesem das
verwendete Timer -Objekt geholt.
|
|
|
Objekte, die das Timer -Interface
implementieren, sind in der Lage, das Zeitmanagement eines
Shops zu
übernehmen. Standardmäßig wird vom Shop ein StepTimer
verwendet, der die Zeit nur dann weiterzählt, wenn seine
goAhead -Methode aufgerufen wird. Ein
zweiter im Framework schon implementierter Timer ist der AutoTimer . An ihm kann ein Zeitintervall
eingestellt werden, nach dem die Zeit weitergezählt
werden soll. Der zu verwendende Timer
kann am Shop über setTimer gesetzt werden.
|
Timer
|
|
Timer sollten immer so implementiert
werden, daß sie mit Objekten zusammenarbeiten, die das
Timer -Interface implementieren. Ein
derartiges Time -Objekt sollte dem
Konstruktor des Timers bei der
Erzeugung übergeben werden können. Auf diese Weise
ist es möglich, mit einem Timer
verschiedene Zeitformate zu verwenden. Mit dem Framework
werden bereits zwei Formate bereitgestellt: Step benutzt eine einfache Variable vom Typ
long , um die Zeit festzuhalten. Dies ist das von
Shop standardmäßig
verwendete Format. Außerdem steht die Klasse Date zur Verfügung. Ein Objekt dieser
Klasse verwaltet ein Datum mit je zwei Stellen für Tag,
Monat und Jahr.
|
|
|
In einem Paar aus Timer und Time ist das Time -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 Timer -Objektes
liegt es, festzulegen, wann und um welches Intervall die Zeit
weiterzuschalten ist.
|
|
|
Vom am Shop geholten Timer -Objekt wird mit getTime 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 Stock geholt werden, der den Münzschacht
des Videoverleihs darstellt. Das Interface Stock ist im Paket data definiert, das also importiert werden
muß:
|
|
|
|
|
|
Nun kann der Stock ermittelt werden:
|
|
|
 |  |  |
 |
Stock coinSlot = Shop.getTheShop().getStock("coin slot");
|  |
 |  |  |
|
|
|
Außerdem wird der DataBasket des
Office' benötigt. Um den Datenkorb zu
erhalten, wird die Methode createFormSheetContent
wie folgt ergänzt:
|
|
|
 |  |  |
 |
DataBasket db = officeOwner.getBasket();
|  |
 |  |  |
|
|
|
Um die Summe in einen korrekt formatierten Geldbetrag
umwandeln zu können, wird noch die vom Shop verwendete Währung benötigt:
|
|
|
 |  |  |
 |
Currency currency = (Currency)Shop.getTheShop().getCatalog("DM");
|  |
 |  |  |
|
|
|
Nun wird mit Hilfe des Datenkorbes die Methode sumStock auf den Geldbestand
angewendet. Diesem wird außerdem ein CatalogItemValue und ein Initialwert
übergeben.
|
|
|
Die Klasse CatalogItemValue wird
verwendet, um den Wert des CatalogItem
festzustellen. In der Standardimplementation ruft ihre getValue -Methode einfach die getValue -Methode des CatalogItems auf und gibt den erhaltenen Wert
weiter. Wird ein anderer Wert gewüscht, muß eine
angepaßte Unterklasse von CatalogItem 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 toString -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 FormSheet 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.
|
|
|
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 SalesPoint 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 FormSheet 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);
}
|  |
 |  |  |
|
|
|
|
Hier der Quelltext der in diesem Kapitel geänderten Klassen:
|
|
|
|
|