import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Einfache Menuestruktur.
* Die Klasse erlaubt die Definition eines Menues und die Auswahl und
* Ausfuehrung der Menueaktion.
*/
public class Menu
{
private static class Item
{
String name;
char key;
Runnable action;
public Item(String name, char key, Runnable action)
{
this.name = name;
this.key = key;
this.action = action;
}
public String toString()
{
return key + " - " + name;
}
}
private String title;
private List items = new ArrayList();
/**
* Erzeugt ein neues Menue.
*
* @param title Titelzeile
*/
public Menu(String title) {
this.title = title;
}
/**
* Definiert eine (weitere) Menuezeile. Wenn das <code>action</code>
* gleich <code>null</code> ist wird bei Auswahl dieses
* Punktes anstelle einer Aktion die Menue-Schleife beendet.
*
* @param name Beschreibung der Auswahl
* @param key Kuerzel fuer die Auswahl (ein Buchstabe!)
* @param action Aktionsobjekt
* @see runnloop
*/
public void add(String name, char key, Runnable action) {
items.add(
new Item(name, Character.toLowerCase(key), action));
}
/**
* Stellt ein Menue dar und fuehrt die gewaehlten Aktionen aus.
* Zunaechst wird der Menuetext auf den Bildschirm geschrieben.
* Anschlie�end wird auf eine mit Return abgeschlossene Zeile gewartet, die
* genau ein Zeichen enthaelt. Wenn definiert, wird die zu diesem Zeichen
* gehoerende Aktion ausgefuehrt (Ansonsten wird nachgefragt). Wenn die
* keine Aktion fuer den gewaehlten Item definiert ist,
* wird die Menueabfrage beendet. Anderfalls wird erneut abgefragt.
*/
public void runloop() {
for (;;) {
printList();
String input = Keyboard.readLine(": ");
if (input.length() != 1)
System.err.println("nur 1 Buchstabe bitte");
else {
char c = Character.toLowerCase(input.charAt(0));
if (perform(c)) return;
}
}
}
/**
* Gibt die Menuepunkte aus.
*/
private void printList() {
System.out.println();
System.out.println(title);
for (Iterator iter = items.iterator(); iter.hasNext();)
System.out.println(iter.next());
}
/**
* Fuehrt die mittels c ausgewaehlt Aktion aus.
*
* @param c Auswahlzeichen
* @return true wenn die Menueschleife beendet werden soll.
*/
private boolean perform(char c) {
for (Iterator iter = items.iterator(); iter.hasNext();) {
Item item = (Item) iter.next();
if (item.key == c) {
if (item.action != null) {
item.action.run();
return false;
}
return true;
}
}
System.err.println("illegaler Buchstabe");
return false;
}
}