J2ME v příkladech – vybíráme si podruhé

9. května 2003

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í ChoiceChoice.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ě:

Nokia 7210, ChoiceGroup
ChoiceGroup na mobilním telefonu Nokia 7210…

Motorola T720i, ChoiceGroup
…na mobilním telefonu Motorola T720i…

Siemens S55, ChoiceGroup
…na mobilním telefonu Siemens S55…

Siemens SL45i, ChoiceGroup
…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:

Nokia 7210, ChoiceGroup
Výsledek volby na mobilním telefonu Nokia 7210…

Motorola T720i, ChoiceGroup
…na mobilním telefonu Motorola T720i…

Siemens S55, ChoiceGroup
…na mobilním telefonu Siemens S55…

Siemens SL45i, ChoiceGroup
…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.

Předchozí článek auto4u.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Petr

    Dub 29, 2011 v 10:41

    Chci se zeptat, je možné dostat nějakým způsobem na displej objekt třídy List a zároveň jeden TextField?

    Odpovědět

Napsat komentář: Petr Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *