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.
| 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 | } |
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.