Lekce 3 - Jednoduchá kalkulačka v Java Swing
V minulém dílu, Java Swing pod pokličkou, jsme si vysvětlili, jak Swing funguje a naučili se centrovat okno aplikace.
V dnešním dílu se podíváme na události a vytvoříme jednoduchou kalkulačku. Bude vypadat takto:

Příprava formuláře
Založte si nový projekt (Java Application bez hlavní třídy) s názvem Kalkulacka. K projektu přidáme nový JFrame Form s názvem KalkulackaJFrame, v Properties nastavte title na Kalkulačka. U aplikací se většinou začíná právě návrhem formuláře. Z palety na něj natáhneme několik komponent. Budeme potřebovat:
- 2x Label
- 1x Button
- 2x Spinner
- 1x ComboBox
Label
Label již známe, jedná se jednoduše o textový popisek.
Pokud komponenty nepoužíváme z kódu, nemusíme je pojmenovávat. Pokud ano, měli bychom je přejmenovat (ukážeme si dále) a přes toto jméno ke komponentě poté z kódu přistoupíme.
Již známe vlastnost text, která obsahuje to, co je na labelu napsáno. Jeden label bude sloužit jen jako popisek s textem "=", nastavte mu ho. Druhý Label bude sloužit pro výpis výsledku a jelikož do něj budeme programově vkládat hodnotu, přejmenujeme ho na vysledekJLabel (s velkým J). To provedeme kliknutím pravým tlačítkem na label a zvolením Change variable name...:

Text nastavíme na hodnotu "0". Font výsledku můžeme zvětšit na velikost 16.
Button
Button je jednoduše tlačítko, které v případě stisku zavolá nějakou metodu (přesněji vyvolá událost). V našem případě se bude tlačítko jmenovat vypocitejJButton a jeho text bude nastaven na "Vypočítej". Událost tlačítku přiřadíme později.
Spinner
Spinner je první komponenta k zadávání hodnoty, kterou si uvedeme. Můžeme do něj zadat celé (a po úpravě i desetinné) číslo. Výhodou zadávání čísel touto komponentou je, že uživatel nemůže zadat nesmyslnou hodnotu. Pokud bychom číslo parsovali z Text Fieldu (který si ukážeme v dalších dílech), mohla by naše aplikace při nevalidním vstupu spadnout. Je vždy jednodušší vybrat správnou komponentu než ošetřovat uživatelský vstup.
Komponenty pojmenujeme jako cislo1JSpinner a cislo2JSpinner. Všimněte si, že jméno by mělo vždy obsahovat i typ komponenty. Můžeme tak mít např. vekJLabel a vekJSpinner, kdy label je popisek pole k zadání věku a spinner je potom toto pole. Navíc se v kódu potom lépe orientuje. Někdy se používá i cisloSpn, vypocitejBtn a podobně.
ComboBox
Jsme skoro v cíli. Combo Box je vyjížděcí seznam s několika předdefinovanými prvky. Prvky můžeme buď naklikat v návrháři nebo vložit z kódu a to i za běhu programu. Toto platí pro všechny komponenty, všechny vlastnosti z návrháře můžeme nastavovat i z kódu.
Komponentu pojmenujeme operaceJComboBox a u vlastnosti Model klikneme na tlačítko "...". Do nově otevřeného okna vypíšeme možnosti, které v Combo Boxu půjdou vybrat. Každou možnost zapíšeme na samostatný řádek, v našem případě to budou hodnoty "+", "-", "*", "/".

Pozn.: Položkami nemusí být jen textové řetězce, ale i objekty. Ukážeme si to později.
Výchozí vybranou položku můžeme nastavit vlastností selectedIndex, 0 je první hodnota.
Nastavené komponenty uspořádáme na formulář tak, jak bylo uvedeno na začátku článku.
Obsluha událostí
Zbývá nám tedy již jen reagovat na událost kliknutí tlačítka. Na tlačítko 2x klikneme a v kódu nám bude vygenerována nová metoda:
private void vypocitejJButtonActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }
Když si rozbalíme vygenerovanou metodu initComponents(), nalezneme u tlačítka několik řádků, které mu nastaví ActionListener. To je objekt, který umí reagovat na nějakou akci (v našem případě kliknutí na tlačítko) a zde zavolá právě výše uvedenou metodu.
vypocitejJButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { vypocitejJButtonActionPerformed(evt); } });
Pokud jste zdejší objektový seriál dočetli až do konce, víte, že se jedná o anonymní třídu. Pokud ne, vůbec to nevadí. Hlavní je, že tušíte, jak je propojení komponenty a klikací metody vytvořené.
Vraťme se ještě do designeru (tlačítko Design v horní liště) a označme tlačítko. V oknu Properties můžeme přepínat mezi Vlastnostmi a Událostmi (Tlačítka Properties a Events).

Vidíme zde naší událost actionPerformed (to je událost kliknutí), kterou odsud můžeme odstranit a případně znovu přidat. Některé komponenty mají speciální události, pro které vygenerujeme metody právě odtud.
*Nikdy neodstraňujte události tak, že vymažete obslužnou metodu z kódu, designer by přestal fungovat a museli byste jeho soubor opravit (konkrétně odstranit přiřazení neexistující metody do události). NetBeans vám to sice ani nedovolí, ale aby vás nenapadlo smazat je např. v jiném editoru. Správně je to jedině přes designer. *
Výpočet
Přejděme k samotnému výpočtu. Kód nebude nijak složitý, jednoduše v obslužné metodě tlačítka naifujeme vybrané položky operaceJComboBoxu a podle toho vypočítáme výsledek. Ten poté nastavíme jako text vysledekJLabel. Neměli bychom zapomenout ošetřit dělení nulou.
Kód obslužné metody by mohl vypadat takto:
private void vypocitejJButtonActionPerformed(java.awt.event.ActionEvent evt) { // příprava proměnných String operace = String.valueOf(operaceJComboBox.getSelectedItem()); int cislo1 = (int)cislo1JSpinner.getValue(); int cislo2 = (int)cislo2JSpinner.getValue(); double vysledek = 0; // výpočet if (operace.equals("+")) vysledek = cislo1 + cislo2; else if (operace.equals("-")) vysledek = cislo1 - cislo2; else if (operace.equals("*")) vysledek = cislo1 * cislo2; else if (operace.equals("/")) { if (cislo2 != 0) vysledek = cislo1 / cislo2; else { vysledek = 0; JOptionPane.showMessageDialog(null, "Nulou nelze dělit"); } } vysledekJLabel.setText(String.valueOf(vysledek)); }
Nejprve si uložíme hodnoty z komponent do proměnných, je to tak přehlednější. K vybrané položce Combo Boxu se dostaneme přes vlastnost getSelectedItem(), která je typu object. V našem případě ho musíme převést na String. Stejně tak bychom mohli pracovat i s pouhým číslem položky přes getSelectedIndex(). Jelikož Spinner vrací hodnotu ve vlastnosti value, která je typu Object, musíme ji přetypovat na int.
V případě nulového dělitele zobrazujeme uživateli MessageBox pomocí statické třídy JOptionPane. Ta obsahuje metodu showMessageDialog(). Nakonec do vysledekJLabel vypíšeme výsledek. Na rozdíl od konzole, kde šlo jednoduše vypsat i čísla, zde musíme číslo nejprve převést na String.
Pokud vypneme formuláři v Properties oknu resizable, nepůjde roztahovat, což se pro naší aplikaci hodí.
Tato aplikace již možná stojí za to, abychom ji někomu poslali. Stisknutím tlačítka s kladívkem a smetákem (Clean and Build Project) vygenerujeme ve složce s projektem složku dist, kde nalezneme soubor Kalkulacka.jar. Jedná se o spustitelný soubor s vaší aplikací. K jeho spuštění samozřejmě musíte mít nainstalovanou Javu, což většina lidí má.
Kód je jako vždy v příloze.
V následujícím cvičení, Řešené úlohy k 1.-3. lekci Java Swing, si procvičíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 1126x (4.94 kB)
Aplikace je včetně zdrojových kódů v jazyce Java