3. diel - Java GUI - udalosť
V minulom dieli sme si vytvorili jednoduchú kalkulačku, ktorá však zatiaľ nesčíta. V dnešnom diele ju už prinútime sčítať celé čísla. V Jave je to možné pomocou riadenia programu udalosťami.
Postup:
- Užívateľ vyvolá akciu napríklad kliknutním na tlačidlo
- Na tlačidlo je pridaný poslucháč udalosti (event listener) - jedná sa o objekt novovytvorenej triedy, do ktorej implementujeme metódy
- Systém vyvolá metódu a niečo sa stane
Ideme teda postupne na to. Triedu s názvom napríklad EventSoucet vytvoríme v našej triede Gui, aby mala prístup ku komponentom. Do triedy implementujeme metódy z triedy ActionListener kľúčovým slovom Implements. IDE by vám malo rovno ponúknuť implementáciu všetkých metód. Každopádne my to dopíšeme ručne. Trieda ActionListener obsahuje len jednu bez návratovú metódu - actionPerformed (ActionEvent e). Kód vyzerá takto:
public class EventSoucet implements ActionListener { public void actionPerformed(ActionEvent e) { } }
Teraz vytvoríme poslucháča udalosti - objekt s názvom napríklad sucet. Jedná sa teda o inštanciu triedy EventSoucet. Ďalej pridáme poslucháča na tlačidlo a to ako parameter metódy addActionListener. Kód bude vyzerať takto:
sectiBut = new JButton("Sečti"); panel1.add(sectiBut); EventSoucet soucet = new EventSoucet(); sectiBut.addActionListener(soucet);
Všetko podstatné máme a teraz sa už môžeme vrhnúť na to, čo sa má stať, keď tlačidlo stlačíme. Kód, ktorý sa vykoná, je v tele metódy actionPerformed (ActionEvent e). Chceme teda aby sme sčítali čísla, ktoré zapíšeme do JTextFieldů. Najprv však z nich tento text musíme získať. Na to nám slúži metóda gettext (). Text ktorý dostaneme je však typu String. Ten sčítať nemôžeme, preto ho musíme přeparsovat na typ Integer.
int prvniCislo = Integer.parseInt(cislo1Field.getText()); int druheCislo = Integer.parseInt(cislo2Field.getText());
Ďalej už len vytvoríme ďalšiu premennú typu int menom vysledok, ktorá bude súčtom tých dvoch čísel. No a nakoniec musíme niekam náš výsledok vypísať. My ho vypíšeme na komponent vysledekLab a to metódou setText () s parametrom textu, ktorý sa na nej má zobraziť.
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é metóda zostáva rovnaká, len nastavíme lepšiu veľkosť a ukážeme si, ako zamedziť rozťahovanie okna. To umožňuje metóda s parametrom 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); }
Keďže je dosť nepraktické vytvárať novú triedu a ešte objekt pre jednu komponent, používa sa väčšinou ako objekt poslucháča anonymný vnútorné trieda. Kód to sprehľadní a zjednoduší. Výsledná trieda potom vyzerá 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 vyzerá nejako takto:
Program funguje, ak zadáme celé čísla. Ošetrenie výnimky popíšem hneď v budúcom tutoriálu. V ňom si tiež kalkulačku rozšírime o ďalšie funkcie a ukážeme si prácu s ďalšou komponentom JComboBox (rozbaľovacie menu).
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é 791x (17.17 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java