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

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

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

 

  Aktivity (1)

Článek pro vás napsal Samik11
Avatar
Autor se věnuje primárně programování v jazyce Java. Nestraní se ani C# nebo PHP.

Jak se ti líbí článek?
Celkem (3 hlasů) :
4.666674.666674.666674.666674.66667


 


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

 

 

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

Avatar
Kit
Redaktor
Avatar
Kit:

Někdy je naopak vhodnější speciální třídu udělat, abychom nemuseli dělat zbytečné gettery a settery a už vůbec ne public vlastnosti. Rozhraní třídy má být co nejtenčí.

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

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:

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:

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:

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:

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:

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:

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

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

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

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.
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 20. Zobrazit vše