Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Kalkulačka v Java Swing v okně - Základy Java Swing

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 - Základy 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í 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 "+", "-", "*", "/".

Položky ComboBoxu z Java Swing v NetBeans IDE - Základy Java Swing

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 - Základy Java Swing

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.

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 1104x (4.94 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Java Swing pod pokličkou
Všechny články v sekci
Základy Java Swing
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 1.-3. lekci Java Swing
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
40 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity