UIDemo: Die interne Klasse 'ExamplesMenu'

Die Implementierung des "Examples"-Untermenüs wäre eigentlich die gleiche wie bei den "System Settings", wenn nicht das "Examples"-Untermenü mehr Einträge hätte als gleichzeitig auf das Display passen. Abhilfe schafft der Befehl drawImage() der Systemklasse jcontrol.io.Display, der durch Angabe zusätzlicher Parameter ermöglicht, einen beliebigen Ausschnitt einer Bilddatei anzuzeigen. So können wir das Bild mit den Menüpunkten auf dem Bildschirm horizontal hin- und herschieben, während der Benutzer durch die Einträge scrollt. Dieses Vorgehen ist übrigens wesentlich effizienter als jeden Menüpunkt in einer eigenen Bilddatei abzulegen und das Menü "manuell" -- Eintrag für Eintrag -- auf das Display zu zeichnen.

Der folgende Quelltext zeigt die Implementierung der Klasse UIDemo$ExamplesMenu, die zum Großteil der Implementierung von UIDemo$SystemMenu entspricht. Der zusätzliche Code für die Scroll-Funktion ist farblich hervorgehoben.

152    /**
153     * Subclass that draws the examples submenu.
154     */
155    class UIDemo$ExamplesMenu {
156      public UIDemo$ExamplesMenu() {
157        int select = 0;
158    
159        loop:for (;;) {
160    
161          UIDemo.lcd.clearRect(0,10,90,7);
162          UIDemo.lcd.clearRect(1,18,126,45);
163          UIDemo.lcd.drawString("Examples", 0, 10);
164    
165          select = choose(select);
166          switch (select) {
167            case 0: // insert code for menu item 1 here
168            case 1: // insert code for menu item 2 here
169            case 2: // insert code for menu item 3 here
170            case 3: // insert code for menu item 4 here
171            case 4: // insert code for menu item 5 here
172            case 5: // insert code for menu item 6 here
173            case 6: // insert code for menu item 7 here
174            case 7: // insert code for menu item 8 here
175              UIDemo.lcd.clearRect(1,18,126,45);
176              UIDemo.lcd.drawString("Selected menu item: ".concat(
177                                     String.valueOf(select+1)),
178                                    10,20);
179              try {
180                ThreadExt.sleep(1000);
181              } catch (InterruptedException e) {}
182            case 8: return;
183            default: break;
184          }
185        }
186      }
187    
188    
189      /**
190       * Trace user choices in network menu
191       */
192      int choose(int select) {
193        int shift = 0, oldselect = -1, oldshift = -1;
194        final int images = 8;
195        Display lcd = UIDemo.lcd;
196    
197        mainloop:for (;;) {
198          if (select-shift>5) shift = select-5;
199          if (select-shift<0) shift = select;
200          if (shift!=oldshift) {
201            // the icons to choose
202            try {
203              lcd.drawImage(new Resource("exampleschooser.jcif"),
204                            4, 23, 120, 40, 20*shift,0);
205            } catch (java.io.IOException e) {}
206            if (oldshift==2) {
207              // delete obsolete pixels
208              lcd.clearRect(1,44,4,19);
209              lcd.clearRect(123,44,4,19);
210            }
211            // left arrow
212            try {
213              lcd.drawImage(new Resource("left.jcif"), 1, 31);
214            } catch (IOException e) {}
215            if (shift<(images-6)) {
216              // right arrow
217              try {
218                lcd.drawImage(new Resource("right.jcif"), 124, 31);
219              } catch (IOException e) {}
220            } else {
221              // no arrow
222              lcd.clearRect(124,30,3,9);
223            }
224          }
225          if (select!=oldselect) {
226            // set selection
227            lcd.setDrawMode(Display.XOR);
228            if (oldselect!=-1 && oldshift==shift)
229              lcd.fillRect(4+(oldselect-shift)*20, 23, 20, 22);
230            lcd.fillRect(4+(select-shift)*20, 23, 20, 22);
231            oldselect = select;
232            lcd.setDrawMode(Display.NORMAL);
233            oldshift = shift;
234          }
235    
236          switch (UIDemo.keys.read()) {
237            case 'u':
238            case 'U':
239            case 'L':
240              if (select == 0) {
241                select = images;
242                break mainloop;
243              }
244              else select--;
245              break;
246            case 'd':
247            case 'D':
248            case 'R':
249              if (select<images-1) select++;
250              break;
251            case 'S':
252              break mainloop;
253          }
254        }
255        return select;
256      }
257    }
Listing 4: Die interne Klasse ExamplesMenu aus UIDemo.java

Nun sind alle Klassen und Methoden die für dieses Beispiel benötigt werden vorhanden. Der nächste Abschnitt beschreibt, wie das fertige UIDemo getestet wird.