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.