3. díl - Jednoduchá kalkulačka v Java Swing

Java Swing Jednoduchá kalkulačka v Java Swing

V minulém dílu seriálu tutoriálů o programování formulářových aplikací v Java Swing 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:

Kalkulačka v Java Swing v okně

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

Přejmenování komponenty v Java Swing

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í kontrolka 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 kontrolkou 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 "+", "-", "*", "/".

Položky ComboBoxu z Java Swing v NetBeans IDE

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

Události v NetBeans

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 showMessageDi­alog(). 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. Příště si vytvoříme složitější aplikaci s více formuláři, bude se jednat o připomínač narozenin.


 

Stáhnout

Staženo 692x (28.45 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (2 hlasů) :
4444 4


 


Miniatura
Předchozí článek
Java Swing pod pokličkou
Miniatura
Všechny články v sekci
Okenní aplikace v Java Swing

 

 

Komentáře

Avatar
Zdeněk Bauer
Redaktor
Avatar
Zdeněk Bauer:

Je to jen v tomto příkladu, nebo se celkově ty funkce tolik podobají funkcím z C#? :)

 
Odpovědět 8.11.2013 22:45
Avatar
martinsakra
Redaktor
Avatar
Odpovídá na Zdeněk Bauer
martinsakra:

myslíš jako vlastnosti a události na jednotlivých částí (button,label atd?). No uplně stejně to není, ale co jsem se swingem pracoval tak se mi praxe z Winforms hodila, podobností bylo víc než dost, ale nespoléhaal bych se na to. Mám pocit že jsem byl několikrát překvapen a musel jsem googlit.

Odpovědět 8.11.2013 23:17
Democracy is two wolves and a lamb voting on what to have for lunch. Liberty is a well-armed lamb contesting the vote.
Avatar
t.o.m.a.s.k.o.r.b.a.r:

Mám problém, pořád mi to háže chybu když napíšu třeba operaceJComboBox tak to napíše cannot find symbol :( už jsem zkoušel i okopírovat kód z devbooku ale ani to nepomohlo :(

Editováno 13.11.2013 17:32
 
Odpovědět 13.11.2013 17:31
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na t.o.m.a.s.k.o.r.b.a.r
David Čápka:

Tak jsi ten Combo Box nepojmenoval operaceJComboBOx. Je tu ukázané jak to máš udělat.

Odpovědět 13.11.2013 17:35
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
t.o.m.a.s.k.o.r.b.a.r:

Aha děkuji za pomoc :)

 
Odpovědět 13.11.2013 17:37
Avatar
Roman Duchoň:

Ahoj,

a co ten double v JSpinneru?
int / int nám nehodí "hezký" výsledek.
Vzhledem k větší šanci na odpověď jsem založil vlákno na fóru.
I pro případné budoucí příchozí.

Odpovědět 27. října 15:58
RD
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.