UIDemo: Die interne Klasse 'MainMenu'

Im letzten Abschnitt haben wir gesehen, dass die Klasse UIDemo die Methoden draw() und choose(int) aus der Klasse UIDemo$MainMenu aufruft, die nun implementiert werden soll.

Die Aufgabe von draw() ist, das Hintergrundbild zu zeichnen. Eigentlich ist diese Aufgabe so trivial, dass sie gar nicht in eine eigene Methode gekapselt werden müsste. Allerdings wäre es denkbar, die Methode in einem späteren Entwicklungsstadium der Software zu erweitern.

Die Methode choose(int) besteht aus einer Schleife, in der das Piktogramm des jeweils angezeigten Hauptmenüs gezeichnet und dann auf eine Tastatureingabe gewartet wird. Durch Drücken eines Tasters wird die Schleife verlassen (Befehl break mainloop;) und die Nummer des ausgewählten Menüpunktes zurückgegeben. Das folgende Listing zeigt die genaue Implementierung der beiden Methoden:

1    /**
2     * Subclass that draws the main menu.
3     */
4    class UIDemo$MainMenu {
5      /**
6       * Draws the background image
7       */
8      public void draw() {
9        try {
10          UIDemo.lcd.drawImage(new Resource("background.jcif"), 0,0);
11          UIDemo.lcd.drawString("Main menu", 0, 10);
12        } catch (IOException e) {}
13      }
14    
15      /**
16       * Draws the main menu items and lets the user choose.
17       * @param select Item to draw
18       * @return int Selected item
19       */
20      public int choose(int select) {
21        boolean selected = false;
22        int entryCount = 2; // number of menu entries
23    
24        // trace user choices
25        menuloop:for (;;) {
26    
27          switch (select) {
28            case 0: // examples
29              try {
30                UIDemo.lcd.clearRect(54,18,15,5);
31                UIDemo.lcd.drawImage(new Resource("examples.jcif"),
32                                     14, 24);
33                UIDemo.lcd.drawImage(new Resource("big_right.jcif"),
34                                     122, 32);
35                UIDemo.lcd.drawImage(new Resource("down.jcif"),
36                                     54, 58);
37              } catch (IOException e) {}
38              break;
39            case 1: // system settings
40              try {
41                UIDemo.lcd.clearRect(54,58,15,5);
42                UIDemo.lcd.drawImage(new Resource("syssettings.jcif"),
43                                     14, 24);
44                UIDemo.lcd.drawImage(new Resource("big_right.jcif"),
45                                     122, 32);
46                UIDemo.lcd.drawImage(new Resource("up.jcif"),
47                                     54, 18);
48              } catch (IOException e) {}
49              break;
50          }
51    
52          // wait for keypress
53          switch (UIDemo.keys.read()) {
54            case 'R': selected = true; break;
55            case 'U':
56            case 'u': if (select > 0) select--; break;
57            case 'L': break;
58            case 'D':
59            case 'd': if (select < entryCount-1) select++; break;
60            case 'S': selected = true; break;
61          }
62    
63          if (selected)
64            break menuloop;
65        }
66        return select;
67      }
68    }
Listing 2: Die interne Klasse MainMenu aus UIDemo.java

Damit wäre das Hauptmenu fertig. Was noch bleibt ist die Umsetzung der beiden Untermenüs (SystemMenu und ExamplesMenu), womit wir uns in den folgenden beiden Abschnitten beschäftigen wollen.