Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

5. diel - Programovanie jednoduchých Java GUI hier - Udalosti

V tomto diele dodáme našim programom schopnosť reagovať. Pozrieme sa na to, čo sú to udalosti a ako sa v Jave používajú.

Udalosti

Doteraz boli naše programy statické. Nijako nereagovali na to, čo sa okolo nich deje. Je na čase to zmeniť.

import javax.swing.JFrame;

public class HlavniOkno extends JFrame {

    public HlavniOkno() {
        this.setTitle("Události");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        PanelUdalosti panel = new PanelUdalosti();
        this.add(panel);

        this.pack();
    }

    public static void main(String[] args) {
        new HlavniOkno().setVisible(true);
    }
}

Hlavné okno je rovnaké ako tá predchádzajúca a v nasledujúcich programoch sa nebude meniť.

Začneme jednoduchým panelom, do ktorého umiestnime dve grafické komponenty: tlačidlo (button) a nálepku (label).

import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PanelUdalosti extends JPanel {
    private JButton tlacitko;
    private JLabel navesti;

    public PanelUdalosti() {
        this.setPreferredSize(new Dimension(300, 40));

        tlacitko = new JButton("Tlačítko");
        this.add(tlacitko);

        navesti = new JLabel("Tady je návěstí");
        this.add(navesti);
    }
}

Vytvoríme si dve premenné. Jednu typu JButton (tlačidlo) a druhú typu JLabel (nálepka). Opäť sú private, pretože s nimi budeme chcieť pracovať iba v rámci tejto triedy.

private JButton tlacitko;
private JLabel navesti;

Zatiaľ sme ešte tlačidlo ani nálepku nevytvorili. Len máme premenné, do ktorých potom na ne uložíme referenciu (odkaz), a ktoré budú viditeľné (vďaka tomu, že sú deklarované na začiatku triedu a mimo metódy) v celej triede.

tlacitko = new JButton("Tlačítko");

Vytvoríme objekt typu JButton (tlačidlo s popiskom Tlačidlo) a uložíme odkaz na neho do premennej tlacitko.

this.add(tlacitko);

Aby sa mohlo tlačidlo zobraziť, musíme ho umiestni do panelu. Je to podobné ako s panelom. Aby sa zobrazil, musíme ho umiestniť do okna.

navesti = new JLabel("Tady je návěstí");
this.add(navesti);

S objektom typu JLabel je to obdobné. JLabel slúži ako jednoduchý popis, návestí.

Ak si program spustíte a kliknete na tlačidlo, zistíte, že nič nerobí. Ono je to logické. Nepovedali sme programu, čo má urobiť po stlačení tlačidla. Hneď to napravíme, len čo si povieme pár základných informácií o udalostiach v Jave.

Udalosti v Jave - Tvorba hier v Java Swing

Udalosť môže vzniknúť iba na komponente, ktorá má schopnosť udalosti vytvárať. Navyše komponenta môže vytvárať viac druhov udalostí. Tak napríklad komponenta JLabel. Tá nemá schopnosť udalosti vytvárať. Na druhú stranu také tlačidlo môže vytvoriť udalosť pri stlačení. Sú proste komponenty, ktoré udalosti nevytvára a sú tie, ktoré udalosti vytvára.

Zostaneme pri tlačidle. Že po jeho stlačení vznikne udalosť, to už vieme. Čo to však je tá udalosť? Prekvapivo je to objekt. Tento objekt v sebe má informácie o tom, akého je typu (stlačené tlačidlo), ktorá komponent ho vytvorila (JButton) atď .. Jednoducho je to správa. Táto správa (objekt) vzniká vždy pri stlačení tlačidla. Aj v tomto našom príklade. Nie je ale nikto, kto by na ňu zareagoval, takže síce vznikne, ale nič sa nedeje.

Aby sa to zmenilo, musí si komponenta zaregistrovať poslucháča. Tomu poslucháči je potom správa poslaná a on na ňu môže reagovať. Je tu ale jedna podmienka. Poslucháč musí mať schopnosť počúvať. Zoberme si príklad z firmy. Nadriadený si vyberie, kto ho bude počúvať - môže ich byť aj viac (zaregistruje si ho ako poslucháča) a tomu (tým) bude posielať správy (objekt udalosti). Pokiaľ ale daný podriadený nevie čítať, tak mu nadriadený môže posielať čo chce, ale reakcia sa nedočká. Rovnaký výsledok by dosiahol, ak by si za poslucháča zaregistroval akvarijné rybičky.

Späť k Jave. Máme tlačidlo a chceme aby sa po jeho stlačení niečo vykonalo. Vytvoríme si teda objekt a tlačidlo si ho zaregistruje ako poslucháča. To aby daný objekt mal schopnosť počúvať zabezpečíme tak, že bude implementovať rozhranie, ktoré mu dá schopnosť načúvať udalostiam vytvoreným tlačidlom. Následne už len naprogramujeme to, čo chceme aby sa po odoslaní udalosti (správy) stalo.

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PanelUdalosti extends JPanel {
    private JButton tlacitko;
    private JLabel navesti;

    public PanelUdalosti() {
        this.setPreferredSize(new Dimension(300, 40));
        tlacitko = new JButton("Tlačítko");
        this.add(tlacitko);

        PosluchacTlacitka posluchac = new PosluchacTlacitka();
        tlacitko.addActionListener(posluchac);

        navesti = new JLabel("Tady je návěstí");
        this.add(navesti);
    }

    private class PosluchacTlacitka implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            navesti.setText("Stisknul jsi tlačítko.");
        }
    }
}
Udalosť tlačidlá v Jave - Tvorba hier v Java Swing
Udalosť tlačidlá v Jave - Tvorba hier v Java Swing

Začneme od konca.

private class PosluchacTlacitka implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        navesti.setText("Stisknul jsi tlačítko.");
    }
}

Vytvoríme triedu poslucháča pre tlačidlo (tu ho vytvárame ako triedu v triede). Môžeme ho ale kľudne vytvoriť ako samostatnú triedu v samostatnom súbore. Pre zjednodušenie som sa rozhodol pre toto riešenie. JButton vytvára udalosti (objekty, správy) typu ActionEvent. Aby na ne mohol poslucháč reagovať, musí implementovať rozhranie ActionListener. Toto rozhranie má jedinú metódu actionPerformed (ActionEvent e), do ktorej sa naprogramuje to, čo má poslucháč po prijatí správy (udalosti) robiť (metódu prekrývame, preto to označenie @Overrride). V tomto prípade zmeníme text na JLabel z "Tu je návesťou" na "Stlačili si tlačidlo.". Parameter ActionEvent (čo je tá vlastné správa s informáciami o tom kto ju vytvoril atď.) Tu nevyužívame. Stačí nám, že správa došla.

PosluchacTlacitka posluchac = new PosluchacTlacitka();

Vytvoríme nový objekt typu PosluchacTlacitka.

tlacitko.addActionListener(posluchac);

Tlačidlo si objekt typu PosluchacTlacitka zaregistruje ako svojho poslucháča, ktorému bude zasielať udalosti (správy).

Tento spôsob reakciou na udalosti je rovnaký, čo sa mení sú typy udalostí. V ďalšom diele sa pozrieme na udalosti generované klávesnicou.


 

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é 298x (2.23 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Programovanie jednoduchých Java GUI hier - Obrázky
Všetky články v sekcii
Tvorba hier v Java Swing
Preskočiť článok
(neodporúčame)
Programovanie jednoduchých Java GUI hier - Udalosti 2
Článok pre vás napísal vita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity