Java týden První novoroční výprodej
Hledáš brigádu v IT, která bude 100 % home office a 100 % flexibilní? Pak napiš na: redakce [zavináč] itnetwork.cz pro více info!
80 % bodů zdarma díky akci Black Friday! Tento týden rovněž sleva na e-learning Java až 80 %

Lekce 3 - Java GUI - událost

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);
Naši partneři možná hledají právě tebe!

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 694x (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?
4 hlasů
Autor se věnuje primárně programování v jazyce Java. Nestraní se ani C# nebo PHP.
Předchozí článek
Java GUI - Základní komponenty
Všechny články v sekci
Java Swing bez grafického návrháře
Miniatura
Následující článek
Java GUI
Aktivity (2)

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:31.1.2013 13:24

S tou anonymní třídou jsem to nevěděl, díky :)

Odpovědět
31.1.2013 13:24
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:31.1.2013 15:07

ActionListener můžeš implementovat i přímo do třídy s GUI a pak se to dělá nějak takto:

tlačítko.addActionListener(this);

Nevýhoda akorát je že při složitějších aplikací je to pak nepřehledné, protože tlačítko není jediné, které volá tuto metodu actionPerformed.
Nastavovat přesně rozměry u takových aplikacích zbytečný a někdy to zabere i zbytečně čas když ti něco nesedí, pokud máš dobře nastavený layout managery aby se ti nerozbilo uspořádání tak je dobré používat po přidání komponent pack() který ti nastaví velikost podle potřeby a nemusíš přemýšlet nad rozměry. Pak ještě pojmenování proměnné Color jako barva, nevím jestli je to nějak vhodné, až budeš mít někde barev 10 budeš si pamatovat která je která? Myslím že ne, lepší by bylo třeba c_purple, ale jak si to pojmenuješ je tvoje věc. Úplně stejně to máš u panelů, panel1, panel2... Jinak oceňuji že tu píšeš návody na Javu, úplně základní věci. Já bych nemohl :-D

 
Odpovědět
31.1.2013 15:07
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:31.1.2013 15:24

Spíš než c_purple bych tu barvu raději pojmenoval víc sémanticky, např. bgColor, barvaPozadi nebo backgroundColor. Barva se může změnit, ale význam ne.

Odpovědět
31.1.2013 15:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Samik11
Redaktor
Avatar
Odpovídá na Fugiczek
Samik11:31.1.2013 23:26

V minulém díle jsem metodu pack() ukazoval, rozměry jsou nastaveny jenom proto, aby to vypadalo lépe. Názvy jsou jednoduché pro ukázku, mimochodem může napsat článek o syntaktických konvencích v Javě ;-), hodilo by se to... Hele nechceš napsat něco o síťové komunikaci v Javě? Celkem bych se rád přiučil, plánuju se na to vrhnout. :-)

Odpovědět
31.1.2013 23:26
„Radost vidět a rozumět, to je nejkrásnější dar přírody.“ Albert Einstein
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Samik11
Fugiczek:1.2.2013 10:33

Každý programátor si názvy píše trochu jinak. V Javě se má používat velbloudí syntaxe, ale u proměnných někdy používám podtržítka. Ono je dobré se naučit psát výstižné názvy už od začátku, protože ve větších programech se pak ztratíš. Záleží co by tě tam zajímalo, TCP/UDP, sokety, komunikace server-klient, připojení na stránku, atd.

 
Odpovědět
1.2.2013 10:33
Avatar
VJ
Neregistrovaný
Avatar
VJ:26.3.2013 15:52

Zravim, bude dalsi dil ? Docela rad se priucuji z tvehi clanku.. jinak by bylo super treba to delat i tom rozhrani primo netbeans nebo tak kdy tam rovnou mame paletu tlacitek.

Diky

 
Odpovědět
26.3.2013 15:52
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na VJ
David Čápka:26.3.2013 15:58

O NetBeans klidně napíšu, mají dobrý designer. Jinak kdyby to tu Samik dojel, bylo by to super, o tom žádná :P

Odpovědět
26.3.2013 15:58
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Samik11
Redaktor
Avatar
Odpovídá na David Čápka
Samik11:26.3.2013 16:22

OK, zkusím se na to co nejdříve vrhnout ... :-)

Odpovědět
26.3.2013 16:22
„Radost vidět a rozumět, to je nejkrásnější dar přírody.“ Albert Einstein
Avatar
javaucen
Neregistrovaný
Avatar
javaucen:3.7.2013 10:28

ahoj,
Máte někdo zkušenost s compare ?
Chtěl bych udělat,aby se po zadání slova heslo do textfieldu změnil text v labelu.
Díky moc

 
Odpovědět
3.7.2013 10:28
Avatar
domino.turak
Člen
Avatar
domino.turak:16.7.2013 12:30

Inač podľa mňa je to zbytočné robiť pre to špeciálnu triedu... ak by sme chceli urobiť tu EventSecti tak by sme potrebovali bud zmenit cislo1Field a cislo2Field na public alebo vytvorit gettery... takze toto by som ani do clanku nedaval,lebo ked si napises takuto triedu tak to vlastne ani neide :)

Odpovědět
16.7.2013 12:30
"Never give up!"
Avatar
Kit
Redaktor
Avatar
Odpovídá na domino.turak
Kit:16.7.2013 12:41

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ů.
Naši partneři možná hledají právě tebe!
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
Odpovídá na javaucen
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.6.2017 22:04

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

 
Odpovědět
12.6.2017 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 21 zpráv z 21.