J2ME v příkladech – vybíráme si podruhé
Obsahem předchozího článku byl úvod do používání komponent pro výběr ze seznamu prvků. Ukázali jsme si, jak používat třídu List, pomocí které se dají tvořit seznamy položek k výběru. Tímto způsobem se ale dá na displej umístit jen jeden seznam. V tomto článku si vysvětlíme, jak funguje třída ChoiceGroup, pomocí které můžeme na displej umístit více skupin různých typů.
Třída ChoiceGroup
Třída ChoiceGroup
je potomkem třídy Item
, což určuje způsob jejího použití. Zatímco seznam typu List
je možné umístit na displej samostatně, ChoiceGroup
je nutno umístit na takzvaný formulář (Form
). Právě umístění na formulář nám umožní zobrazit více skupin různých typů najednou.
Skupiny prvků vkládáme do formuláře metodou append()
– zobrazují se v pořadí, ve kterém jsme je vložili. Tím můžeme sami určit pořadí prvků na našem formuláři a tak zajistit jeho přehlednost. Samotné skupiny prvků jsou označeny nadpisem, stejně jako seznam položek List
. Tyto nadpisy umožňují dělení formuláře na logické prvky a napomáhají uživateli midletu v orientaci po často rozsáhlém seznamu prvků.
Po zobrazení formuláře je kurzor umístěn na prvním prvku první skupiny. Při posunu se přemisťuje na nejbližší prvek v požadovaném směru. Pokud se ocitne na konci jedné skupiny prvků, pokračuje přemístěním na nejbližší prvek další skupiny. Při výběru prvku ze skupiny je tento prvek buď vybrán jako jeden z několika, nebo označením přidán do skupiny, to záleží na typu skupiny prvků (EXCLUSIVE, MULTIPLE). To ale nejlépe sami uvidíte na dnešním příkladu.
Pro vytvoření instance třídy ChoiceGroup
můžeme použít dva typy konstruktoru. První pouze vytvoří prázdnou skupinu prvků:
ChoiceGroup cg_skupina = new ChoiceGroup(String nadpis, int typ výběru);
Nadpis je řetězec, který popisuje skupinu. Typ výběru je celé číslo udávající možnosti výběru EXCLUSIVE nebo MULTIPLE (IMPLICIT skupina prvků nepovoluje). Místo čísla je možno použít statické hodnoty rozhraní Choice
– Choice.EXCLUSIVE
pro hodnotu „1“ nebo Choice.MULTIPLE
pro hodnotu „2“. Do této skupiny pak můžeme pomocí metody append(String popis, Image ikona);
vkládat položky.
Pokud chceme vytvořit skupinu prvků, která už obsahuje položky, zvolíme následující konstruktor:
ChoiceGroup cg_skupina = new ChoiceGroup(String nadpis, int typ výběru, String[] položky, Image[] ikony);
Pole položky
obsahuje řetězce, které popisují jednotlivé položky, pole s obrázky ikony
obsahuje pole obrázků, patřící k jednotlivým položkám. Pole použitá v konstruktoru zastupují metodu append(String popis, Image ikona);
a plní skupinu prvků stejným způsobem.
Nyní už se podíváme na zdrojový kód dnešního příkladu:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Abc extends MIDlet implements CommandListener {
Display disp;
ChoiceGroup cg_barva;
ChoiceGroup cg_vybava;
Command cmd_exit;
Command cmd_next;
Form frm_volba;
Form frm_vysledek;
StringItem si_barva;
StringItem si_vybava;
public Abc() {
/* Zde vytvoříme skupinu pro výběr prvku typu EXCLUSIVE
* což znamená že z této skupiny je možno vybrat pouze
* jeden prvek, to známe z minulého dílu.
*/
cg_barva = new ChoiceGroup(„Barva“, Choice.EXCLUSIVE);
cg_barva.append(„Modra“, null);
cg_barva.append(„Cervena“, null);
/* Zde je podobná skupina, liší se jen typem který
* určuje možnost výběru libovolného počtu položek.
*/
cg_vybava = new ChoiceGroup(„Vybava“, Choice.MULTIPLE);
cg_vybava.append(„Klimatizace“, null);
cg_vybava.append(„Airbag“, null);
cg_vybava.append(„Autoradio“, null);
cg_vybava.append(„ABS“, null);
cmd_next = new Command(„Dalsi“, Command.SCREEN, 1);
cmd_exit = new Command(„Konec“, Command.SCREEN, 1);
/*Vytvoříme textové položky do kterých zapíšeme výsledky
* výběru. Umístíme je na formulář frm_vysledek.
*/
si_barva = new StringItem(„Barva“, „“);
si_vybava = new StringItem(„Vybava“, „“);
/* Formulář pro volbu barvy a výbavy. Na něj umístíme
* skupiny cg_barva a cg_vybava, zobrazeny budou
* v pořadí v jakém jsme je na formulář umístili.
*/
frm_volba = new Form(„Volba“);
frm_volba.append(cg_barva);
frm_volba.append(cg_vybava);
frm_volba.addCommand(cmd_next);
frm_volba.addCommand(cmd_exit);
/* Formulář pro zobrazení výsledku, obsahuje jen
* dvě textové položky si_barva a si_vybava.
*/
frm_vysledek = new Form(„Vybrano“);
frm_vysledek.append(si_barva);
frm_vysledek.append(si_vybava);
frm_vysledek.addCommand(cmd_exit);
}
public void startApp() {
disp = Display.getDisplay(this);
frm_volba.setCommandListener(this);
disp.setCurrent(frm_volba);
}
public void pauseApp() { }
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
public void commandAction(Command c, Displayable d) {
if(c == cmd_exit) { notifyDestroyed(); }
if(c == cmd_next) { proceed(); }
}
public void proceed() {
/* Nejprve kombinací metody pro zjištění vybrané položky getSelectedIndex()
* a metody pro získání popisu položky getString(int položka) získáme popis
* vybrané položky a nastavíme ji jako obsah textové položky si_barva.
*/
si_barva.setText(cg_barva.getString(cg_barva.getSelectedIndex()));
/* potom projdeme všechny prvky skupiny cg_vybava a pokud najdeme
* označený prvek, tak jeho popis přidáme do seznamu zvolené výbavy.
* Nejprve zjistíme velikost skupiny prvků cg_vybava.
*/
int prvky = cg_vybava.size();
String vybava = „“;
/* V cyklu projdeme celý seznam.
*/
for(int a=0; a<prvky; a++) {
if(cg_vybava.isSelected(a)) {
// pokud je prvek vybraný, přidá se jeho popis k seznamu
vybava = vybava + cg_vybava.getString(a) + “ „;
}
}
/* A získaný seznam vložíme do textové položky si_vybava.
*/
si_vybava.setText(vybava);
frm_vysledek.setCommandListener(this);
disp.setCurrent(frm_vysledek);
}
}
Midlet po spuštění zobrazí formulář, který obsahuje dvě skupiny položek pro výběr – barvu a výbavu vozu. Po zvolení jedné z barev, libovolného počtu prvků z výbavy a zvolení příkazu Další, zobrazí další formulář. Ten obsahuje dvě textové položky (StringItem
), které obsahují popis vybraných položek. Spuštěný midlet vypadá následovně:
ChoiceGroup na mobilním telefonu Nokia 7210…
…na mobilním telefonu Motorola T720i…
…na mobilním telefonu Siemens S55…
…a na mobilním telefonu Siemens SL45i.
Po výběru položek a volbě příkazu Další, midlet zavolá metodu proceed()
. Ta projde prvky obou skupin cg_barva
a cg_vybava
, jejich obsah uloží do textových položek si_barva
a si_vybava
a následně zobrazí další formulář. Jak to vypadá, můžeme vidět na následujících obrázcích:
Výsledek volby na mobilním telefonu Nokia 7210…
…na mobilním telefonu Motorola T720i…
…na mobilním telefonu Siemens S55…
…a na mobilním telefonu Siemens SL45i.
Jak sami vidíte, je používání třídy ChoiceGroup
velmi podobné použití třídy List
. Pomocí této komponenty se dají vytvářet prakticky libovolné seznamy položek pro výběr, formuláře jsou trochu podobné formulářům, které známe z www stránek.
Skupiny pro výběr prvků Choicegroup
lze mimo jiné také kombinovat s prvkem pro vkládání textu TextField
. Ukázky jeho použití jsme probrali v článku o uživatelských vstupech. Textové pole se vkládá na formulář stejně jako skupiny prvků metodou append()
. Příklad použití tohoto prvku mohou aktivnější čtenáři zpracovat jako domácí úlohu.
Další zdroje
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Mohlo by vás také zajímat
-
Responzivní design: Proč by ho neměl ignorovat žádný vývojář?
27. listopadu 2023 -
Optimalizace a zlepšení výkonu kódu: tipy a triky
14. srpna 2023 -
Gaming na HDR monitoru: Stojí to za to?
12. srpna 2024
Nejnovější
-
Jak se chránit před podvody na internetu – část 2
14. října 2024 -
Doména .io v ohrožení: Co přinese předání Čagoských ostrovů?
10. října 2024 -
Jak se chránit před podvody na internetu – část 1
8. října 2024
Petr
Dub 29, 2011 v 10:41Chci se zeptat, je možné dostat nějakým způsobem na displej objekt třídy List a zároveň jeden TextField?