IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

3. diel - Jednoduchá kalkulačka v Java Swing

V minulom dieli seriálu tutoriálov o programovaní formulárových aplikácií v Java Swing sme si vysvetlili, ako Swing funguje a naučili sa centrovať okno aplikácie. V dnešnom dieli sa pozrieme na udalosti a vytvoríme jednoduchú kalkulačku. Bude vyzerať takto:

Kalkulačka v Java Swing v okne - Základy Java Swing

Príprava formulára

Založte si nový projekt (Java Application bez hlavnej triedy) s názvom Kalkulacka. K projektu pridáme nový JFrame Form s názvom KalkulackaJFrame, v Properties nastavte title na Kalkulačka. Pri aplikáciách sa väčšinou začína práve návrhom formulára. Z palety na neho natiahneme niekoľko komponentov. Budeme potrebovať:

  • 2x Label
  • 1x Button
  • 2x Spinner
  • 1x ComboBox

Label

Label už poznáme, jedná sa jednoducho o textový popis.

Ak komponenty nepoužívame z kódu, nemusíme ich pomenovávať. Ak áno, mali by sme ich premenovať (ukážeme si ďalej) a cez toto meno ku komponentu potom z kódu pristúpime.

Už poznáme vlastnosť text, ktorá obsahuje to, čo je na labeli napísané. Jeden label bude slúžiť len ako návestie s textom "=", nastavte mu ho. Druhý Label bude slúžiť pre výpis výsledku a keďže do neho budeme programovo vkladať hodnotu, premenujeme ho na vysledekJLabel (s veľkým J). To vykonáme kliknutím pravým tlačidlom na label a zvolením Change variable name ...:

Premenovanie komponenty v Java Swing - Základy Java Swing

Text nastavíme na hodnotu "0". Font výsledku môžeme zväčšiť na veľkosť 16.

Button

Button je jednoducho tlačidlo, ktoré v prípade stisku zavolá nejakú metódu (presnejšie vyvolá udalosť). V našom prípade sa bude tlačidlo menovať vypocitejJButton a jeho text bude nastavený na "Vypočítaj". Udalosť tlačidlu priradíme neskôr.

Spinner

Spinner je prvý komponent k zadávanie hodnoty, ktorú si uvedieme. Môžeme do neho zadať celé (a po úprave i desatinné) číslo. Výhodou zadávanie čísel touto komponentom je, že užívateľ nemôže zadať nezmyselnú hodnotu. Ak by sme číslo parsovali z Text Field (ktorý si ukážeme v ďalších dieloch), mohla by naše aplikácie pri nevalidním vstupe spadnúť. Je vždy jednoduchšie vybrať správnu komponent ako ošetrovať užívateľský vstup.

Komponenty pomenujeme ako cislo1JSpinner a cislo2JSpinner. Všimnite si, že meno by malo vždy obsahovať aj typ komponenty. Môžeme tak mať napr. VekJLabel a vekJSpinner, kedy label je label pole na zadanie veku a spinner je potom toto pole. Navyše sa v kóde potom lepšie orientuje. Niekedy sa používa aj cisloSpn, vypocitejBtn a podobne.

ComboBox

Sme skoro v cieli. Combo Box je Výjazdný zoznam s niekoľkými preddefinovanými prvkami. Prvky môžeme buď naklikať v návrhári alebo vložiť z kódu a to aj za behu programu. Toto platí pre všetky komponenty, všetky vlastnosti z návrhára môžeme nastavovať iz kódu.

Komponent pomenujeme operaceJComboBox au vlastnosti Model klikneme na tlačidlo "...". Do novo otvoreného okna vypíšeme možnosti, ktoré v Combo Boxu pôjdu vybrať. Každú možnosť zapíšeme na samostatný riadok, v našom prípade to budú hodnoty "+", "-", "*", "/".

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

Pozn .: Položkami nemusí byť len textové reťazce, ale aj objekty. Ukážeme si to neskôr.

Predvolené vybranú položku môžeme nastaviť vlastností selectedIndex, 0 je prvá hodnota.

Nastavené komponenty usporiadame na formulár tak, ako bolo uvedené na začiatku článku.

Obsluha udalostí

Zostáva nám teda už len reagovať na udalosť kliknutí tlačidla. Na tlačidlo 2x klikneme a v kóde nám bude vygenerovaná nová metóda:

private void vypocitejJButtonActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
}

Keď si rozbalíme vygenerovanú metódu initComponents (), nájdeme pri tlačidle niekoľko riadkov, ktoré mu nastaví ActionListener. To je objekt, ktorý vie reagovať na nejakú akciu (v našom prípade kliknutia na tlačidlo) a tu zavolá práve vyššie uvedenú metódu.

vypocitejJButton.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        vypocitejJButtonActionPerformed(evt);
    }
});

Ak ste tunajší objektový seriál dočítali až do konca, viete, že sa jedná o anonymné triedu. Ak nie, vôbec to nevadí. Hlavné je, že tušíte, ako je prepojenie komponenty a klikacie metódy vytvorené.

Vráťme sa ešte do Designeri (tlačidlo Design v hornej lište) a označme tlačidlo. V oknu Properties môžeme prepínať medzi Vlastnosťami a Udalosťami (Tlačidlá Properties a Events).

Udalosti v NetBeans - Základy Java Swing

Vidíme tu našej udalosť actionPerformed (to je udalosť kliknutie), ktorú odtiaľto môžeme odstrániť a prípadne znovu pridať. Niektoré komponenty majú špeciálne udalosti, pre ktoré vygenerujeme metódy práve odtiaľ.

  • Nikdy neodstraňujte udalosti tak, že vymažete obslužnú metódu z kódu, designer by prestal fungovať a museli by ste jeho súbor opraviť (konkrétne odstrániť priradenie neexistujúce metódy do udalosti). NetBeans vám to síce ani nedovolia, ale aby vás nenapadlo zmazať je napr. V inom editore. Správne je to jedine cez designer. *

Výpočet

Prejdime k samotnému výpočtu. Kód nebude nijako zložitý, jednoducho v obslužnej metóde tlačidla naifujeme vybrané položky operaceJComboBoxu a podľa toho vypočítame výsledok. Ten potom nastavíme ako text vysledekJLabel. Nemali by sme zabudnúť ošetriť delenie nulou.

Kód obslužné metódy by mohol vyzerať 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));
}

Najprv si uložíme hodnoty z komponentov do premenných, je to tak prehľadnejšie. K vybranej položke Combo Boxu sa dostaneme cez vlastnosť getSelectedItem (), ktorá je typu object. V našom prípade ho musíme previesť na String. Rovnako tak by sme mohli pracovať aj s jednoduchým číslom položky cez getSelectedIndex (). Keďže Spinner vracia hodnotu vo vlastnosti value, ktorá je typu Object, musíme ju pretypovať na int.

V prípade nulového deliteľa zobrazujeme užívateľovi MessageBox pomocou statickej triedy JOptionPane. Tá obsahuje metódu showMessageDialog (). Nakoniec do vysledekJLabel vypíšeme výsledok. Na rozdiel od konzoly, kde šlo jednoducho vypísať aj čísla, tu musíme číslo najprv previesť na String.

Ak vypneme formulári v Properties oknu resizable, nepôjde rozťahovať, čo sa pre našu aplikáciu hodí.

Táto aplikácia už možno stojí za to, aby sme ju niekomu poslali. Stlačením tlačidla s kladivkom a zmetákom (Clean and Build Project) vygenerujeme v zložke s projektom zložku dist, kde nájdeme súbor Kalkulacka.jar. Ide o spustiteľný súbor s vašou aplikáciou. K jeho spusteniu samozrejme musíte mať nainštalovanú Javu, čo väčšina ľudí má.

Kód je ako vždy v prílohe. Nabudúce si vytvoríme zložitejšie aplikáciu s viacerými formulármi, bude sa jednať o pripomínač narodenín.

V nasledujúcom cvičení, Riešené úlohy k 1.-3. lekciu Java Swing, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1109x (4.94 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Java Swing pod pokrievkou
Všetky články v sekcii
Základy Java Swing
Preskočiť článok
(neodporúčame)
Riešené úlohy k 1.-3. lekciu Java Swing
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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 sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity