Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

3. díl - Java GUI - událost

Java Swing Swing bez grafického návrháře Java GUI - událost

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulém díle jsme si vytvořili jednoduchou kalkulačku, která ovšem zatím nesčítá. V dnešním díle ji už přinutíme sčítat celá čísla. :-) V Javě je to možné pomocí řízení programu událostmi.

Postup:

  1. Uživatel vyvolá akci například kliknutním na tlačítko
  2. Na tlačítko je přidán posluchač události (event listener) – jedná se o objekt nově vytvořené třídy, do které implementujeme metody
  3. Systém vyvolá metodu a něco se stane

Jdeme tedy postupně na to. Třídu s názvem například EventSoucet vytvoříme v naší třídě Gui, aby měla přístup ke komponentám. Do třídy implementujeme metody ze třídy ActionListener klíčovým slovem implements. IDE by vám mělo rovnou nabídnout implementaci všech metod. Každopádně my to dopíšeme ručně. Třída ActionListener obsahuje jenom jednu bez návratovou metodu - actionPerformed(Ac­tionEvent e). Kód vypadá takto:

public class EventSoucet implements ActionListener {

    public void actionPerformed(ActionEvent e) {

    }

}

Nyní vytvoříme posluchače události - objekt s názvem například soucet. Jedná se tedy o instanci třídy EventSoucet. Dále přidáme posluchače na tlačítko a to jako parametr metody addActionListener. Kód bude vypadat takto:

sectiBut = new JButton("Sečti");
panel1.add(sectiBut);
EventSoucet soucet = new EventSoucet();
sectiBut.addActionListener(soucet);

Vše podstatné máme a teď se už můžeme vrhnout na to, co se má stát, když tlačítko stiskneme. Kód, který se vykoná, je v těle metody actionPerformed(Ac­tionEvent e). Chceme tedy abychom sečetli čísla, která zapíšeme do JTextFieldů. Nejprve však z nich tento text musíme získat. Na to nám slouží metoda getText(). Text který dostaneme je ovšem typu String. Ten sčítat nemůžeme, proto ho musíme přeparsovat na typ Integer.

int prvniCislo = Integer.parseInt(cislo1Field.getText());
int druheCislo = Integer.parseInt(cislo2Field.getText());

Dále už pouze vytvoříme další proměnnou typu int jménem vysledek, která bude součtem těch dvou čísel. No a nakonec musíme někam náš výsledek vypsat. My ho vypíšeme na komponentu vysledekLab a to metodou setText() s parametrem textu, který se na ní má zobrazit.

public class EventSoucet implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        int prvniCislo = Integer.parseInt(cislo1Field.getText());
        int druheCislo = Integer.parseInt(cislo2Field.getText());
        int vysledek = prvniCislo + druheCislo;
        vysledekLab.setText("Výsledek je: " + vysledek);
    }

}

Hlavní metoda zůstává stejná, jenom nastavíme lepší velikost a ukážeme si, jak zamezit roztahování okna. To umožňuje metoda s parametrem boolean (true/ false) okno.setResiza­ble(false).

public static void main(String[] args) {
    Gui okno = new Gui();
    okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    okno.setVisible(true);
    okno.setSize(220, 120);
    okno.setLocationRelativeTo(null);
    okno.setResizable(false);

}

Jelikož je dost nepraktické vytvářet novou třídu a ještě objekt pro jednu komponentu, používá se většinou jako objekt posluchače anonymní vnitřní třída. Kód to zpřehlední a zjednoduší. Výsledná třída pak vypadá takto:

public Gui()
{
    super("Kalkulačka");
    FlowLayout layout = new FlowLayout();
    setLayout(layout);

    Color barva = new Color(150, 75, 130);

    panel1 = new JPanel();
    panel1.setBackground(Color.red);
    add(panel1);

    panel2 = new JPanel();
    panel2.setBackground(barva);
    add(panel2);

    cislo1Field = new JTextField("1. číslo", 5);
    panel1.add(cislo1Field);

    cislo2Field = new JTextField("2. číslo", 5);
    panel1.add(cislo2Field);

    sectiBut = new JButton("Sečti");
    panel1.add(sectiBut);
    sectiBut.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent evt) {
                    int prvniCislo = Integer.parseInt(cislo1Field.getText());
                    int druheCislo = Integer.parseInt(cislo2Field.getText());
                    int vysledek = prvniCislo + druheCislo;
                    vysledekLab.setText("Výsledek je: " + vysledek);
                };
            });


    vysledekLab = new JLabel("Výsledek je. ");
    panel2.add(vysledekLab);
}

Výsledné okno vypadá nějak takto:

udalost

Program funguje, pokud zadáme celá čísla. Ošetření výjimky popíšu hned v příštím tutoriálu. V něm si také kalkulačku rozšíříme o další funkce a ukážeme si práci s další komponentou JComboBox (rozbalovací menu). :-)


 

Stáhnout

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

 

 

Článek pro vás napsal Samik11
Avatar
Jak se ti líbí článek?
3 hlasů
Autor se věnuje primárně programování v jazyce Java. Nestraní se ani C# nebo PHP.
Miniatura
Předchozí článek
Java GUI - Základní komponenty
Miniatura
Všechny články v sekci
Java Swing bez grafického návrháře
Miniatura
Následující článek
Java GUI
Aktivity (1)

 

 

Komentáře
Zobrazit starší komentáře (11)

Avatar
domino.turak
Člen
Avatar
domino.turak:16.7.2013 20:53

No ale veď ked urobíme EventSecti tak potrebujeme getey a setery+ musime si urobit instanciu GUI okno=new GUI() alebo sa mýlim?

Odpovědět 16.7.2013 20:53
"Never give up!"
Avatar
Kit
Redaktor
Avatar
Odpovídá na domino.turak
Kit:16.7.2013 21:04

Mýlíš se. Když ji uděláš jako jako vnořenou třídu, gettery nepotřebuješ.

Odpovědět 16.7.2013 21:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
domino.turak
Člen
Avatar
domino.turak:16.7.2013 21:11

No ved o tom hovorím,že jedine ak ju vytvorím ako anonymnú triedu tak nepotrebujem getery ani nič podobné...

Odpovědět 16.7.2013 21:11
"Never give up!"
Avatar
Kit
Redaktor
Avatar
Odpovídá na domino.turak
Kit:16.7.2013 21:19

Z toho tvého původního příspěvku jsem chápal něco trochu jiného.

Anonymní a vnořená třída jsou rozdílné pojmy.

Odpovědět 16.7.2013 21:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
domino.turak
Člen
Avatar
domino.turak:17.7.2013 10:12

OK, ja už som to pochopil... zaujímavé,prečítal som od začiatku každý článok, urobil každý program a až teraz som sa dozvedel že existuje niečo ako trieda v triede(tzv. vnorená trieda):) Ďakujem autorovi článku a takisto Kitovi že mi to objasnili :P

Odpovědět 17.7.2013 10:12
"Never give up!"
Avatar
Kit
Redaktor
Avatar
Odpovídá na domino.turak
Kit:17.7.2013 10:18

Ještě existují statické vnitřní třídy, které se také chovají trochu jinak. Do nich dávám například automatické testy, které mám v každé třídě. Výhodou je, že se dají snadno vyloučit z výsledného JARu, takže se do produkčního kódu nedostanou.

Odpovědět 17.7.2013 10:18
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Ondrca
Redaktor
Avatar
Ondrca:21.9.2013 15:22

Hoď to jako if() a použij equals.

Odpovědět 21.9.2013 15:22
Zase jsem o něco chytřejší
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na domino.turak
Jan Vargovský:21.9.2013 17:00

Jen doplním, že se jím říká nested :)

 
Odpovědět 21.9.2013 17:00
Avatar
Tomhaus
Člen
Avatar
Tomhaus:24.6.2014 16:45

Jak přidam JTextField do screenu, kterej mi zobrazuje všechno?

Odpovědět 24.6.2014 16:45
Být lepší a chytřejší je důležité, ale někdy se musíme spokojit s tím, co máme.
Avatar
Honza_W
Člen
Avatar
Honza_W:12. června 22:04

JTextField, nezobrazuje. Zobrazuje Label, do JTextFieldu jen píšeš.

 
Odpovědět 12. června 22:04
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 10 zpráv z 21. Zobrazit vše