Lekce 3 - Java GUI - událost
V minulém díle, Java GUI - Základní komponenty, 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:
- Uživatel vyvolá akci například kliknutním na tlačítko
- 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
- 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(ActionEvent 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(ActionEvent 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.setResizable(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:

Program funguje, pokud zadáme celá čísla.
Ošetření výjimky popíšu hned v příštím tutoriálu, Java GUI. V něm
si také kalkulačku rozšíříme o další funkce a ukážeme si práci s
další komponentou JComboBox (rozbalovací menu).
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 794x (17.17 kB)
Aplikace je včetně zdrojových kódů v jazyce Java