|
|
|
|
|
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.
|
Paßwort
|
|
Um auf Klassen aus Swing zugreifen zu
können, muß im Kopf der Klasse
VideoMachine eine import -Anweisung
eingefügt werden:
|
|
|
|
|
|
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 Shop -Menü wird in der Methode
createShopMenuSheet der Klasse Shop 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 MenuSheet zurück. MenuSheets 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 getTaggedItem 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_TAG herausgesucht. Für jeden
Menüpunkt des Shop -Menüs und
der Menüleiste ist in der Klasse Shop ein Tag vorgegeben, so daß jeder
Eintrag der Struktur direkt angesprochen werden kann. Die Tags
für das "MultiWindow"-Menü sind in
der Klasse MultiWindow 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 MenuSheetItem 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 doAction aus
dem Interface Action 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
SalesPoints 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;
|  |
 |  |  |
|
|
|
|
Hier der Quelltext der in diesem Kapitel geänderten Klassen:
|
|
|
|
|