UIDemo: Die interne Klasse 'SystemMenu'

Dieser Abschnitt befasst sich mit der Implementierung des ersten Untermenüs "SystemMenu". Dazu wird im Wesentlichen das Bild des jeweiligen Untermenüs auf das LCD gezeichnet. Der vom Benutzer ausgewählte Untermenüpunkt soll durch eine Invertierung kenntlich gemacht werden. Der folgende Quelltext zeigt die Implementierung dieser Funktionalität anhand der Klasse UIDemo$SystemMenu. An den markierten Stellen können Befehle eingefügt werden, die nach Auswahl eines Menüpunkts ausgeführt werden sollen. Unser Beispiel zeigt den ausgewählten Menüpunkt für 1 Sekunde als String auf dem Display an.

260    /**
261     * Subclass that draws the system settings submenu.
262     */
263    class UIDemo$SystemMenu {
264      public UIDemo$SystemMenu() {
265        int select = 0;
266    
267        loop:for (;;) {
268    
269          UIDemo.lcd.clearRect(0,10,90,7);
270          UIDemo.lcd.clearRect(1,18,126,45);
271          UIDemo.lcd.drawString("System Settings", 0, 10);
272    
273          select = choose(select);
274          switch (select) {
275            case 0: // insert code for menu item 1 here
276            case 1: // insert code for menu item 2 here
277            case 2: // insert code for menu item 3 here
278            case 3: // insert code for menu item 4 here
279            case 4: // insert code for menu item 5 here
280              UIDemo.lcd.clearRect(1,18,126,45);
281              UIDemo.lcd.drawString("Selected menu item: ".concat(
282                                     String.valueOf(select+1)), 10,20);
283              try {
284                ThreadExt.sleep(1000);
285              } catch (InterruptedException e) {}
286            case 5: return;
287            default: break;
288          }
289        }
290      }
291    
292      /**
293       * Draws system settings menu and highlights user's choice.
294       * @param select preselection
295       * @return int selected menu item
296       */
297      int choose(int select) {
298        int oldselect = -1;
299        final int images = 5;
300        Display lcd = UIDemo.lcd;
301    
302        // draw menu
303        try {
304          lcd.drawImage(new Resource("syssettingschooser.jcif"),
305                        14, 23);
306        } catch (java.io.IOException e) {}
307        // left arrow
308        try {
309          lcd.drawImage(new Resource("left.jcif"), 1, 31);
310        } catch (IOException e) {}
311    
312        mainloop:for (;;) {
313          if (select!=oldselect) {
314            // set selection
315            lcd.setDrawMode(Display.XOR);
316            if (oldselect!=-1)
317              lcd.fillRect(14+oldselect*20, 23, 20, 22);
318            lcd.fillRect(14+select*20, 23, 20, 22);
319            oldselect = select;
320            lcd.setDrawMode(Display.NORMAL);
321          }
322    
323          switch (UIDemo.keys.read()) {
324            case 'u':
325            case 'U':
326            case 'L':
327              if (select == 0) {
328                select = images;
329                break mainloop;
330              }
331              else select--;
332              break;
333            case 'd':
334            case 'D':
335            case 'R':
336              if (select<images-1) select++;
337              break;
338            case 'S':
339              break mainloop;
340          }
341        }
342        return select;
343      }
344    }
Listing 3: Die interne Klasse SystemMenu aus UIDemo.java

Für die Vollständigkeit dieser Demo-Applikation fehlt nun lediglich noch das Untermenu ExamplesMenu, welches im nächsten Abschnitt implementiert wird.