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í.

Lekce 5 - Programování jednoduchých Java GUI her - Události

V minulé lekci, Programování jednoduchých Java GUI her - Obrázky, jsme si vytvořili instanci objektu Image, zjišťovali jsme šířku a výšku obrázku a také jsme ho umísťovali na panel.

V tomto díle dodáme našim programům schopnost reagovat. Podíváme se na to, co jsou to události a jak se v Javě používají.

Události

Doposud byly naše programy statické. Nijak nereagovaly na to, co se okolo nich děje. Je na čase to změnit.

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 stejné jako ta předchozí a v následujících programech se nebude měnit.

Začneme jednoduchým panelem, do kterého umístíme dvě grafické komponenty: tlačítko (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);
    }
}

Vytvoříme si dvě proměnné. Jednu typu JButton (tlačítko) a druhou typu JLabel (nálepka). Opět jsou private, protože s nimi budeme chtít pracovat pouze v rámci této třídy.

private JButton tlacitko;
private JLabel navesti;

Prozatím jsme ještě tlačítko ani nálepku nevytvořili. Jen máme proměnné, do kterých pak na ně uložíme referenci (odkaz), a které budou viditelné (díky tomu, že jsou deklarovány na začátku třídu a mimo metody) v celé třídě.

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

Vytvoříme objekt typu JButton (tlačítko s popiskem Tlačítko) a uložíme odkaz na něj do proměnné tlacitko.

this.add(tlacitko);

Aby se mohlo tlačítko zobrazit, musíme jej umísti do panelu. Je to podobné jako s panelem. Aby se zobrazil, musíme jej umístit do okna.

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

S objektem typu JLabel je to obdobné. JLabel slouží jako jednoduchý popisek, návěstí.

Pokud si program spustíte a kliknete na tlačítko, zjistíte, že nic nedělá. Ono je to logické. Neřekli jsme programu, co má udělat po stisknutí tlačítka. Hned to napravíme, jen co si řekneme pár základních informací o událostech v Javě.

Události v Javě - Tvorba her v Java Swing

Událost může vzniknout pouze na komponentě, která má schopnost události vytvářet. Navíc komponenta může vytvářet více druhů událostí. Tak například komponenta JLabel. Ta nemá schopnost události vytvářet. Na druhou stranu takové tlačítko může vytvořit událost při stisknutí. Jsou prostě komponenty, které události nevytváří a jsou ty, které události vytváří.

Zůstaneme u tlačítka. Že po jeho stisknutí vznikne událost, to už víme. Co to však je ta událost? Překvapivě je to objekt. Tento objekt v sobě má informace o tom, jakého je typu (stisknuté tlačítko), která komponenta jej vytvořila (JButton) atd.. Jednoduše je to zpráva. Tato zpráva (objekt) vzniká vždy při stisknutí tlačítka. I v tomto našem příkladě. Není ale nikdo, kdo by na ni zareagoval, takže sice vznikne, ale nic se neděje.

Aby se to změnilo, musí si komponenta zaregistrovat posluchače. Tomu posluchači je pak zpráva poslána a on na ni může reagovat. Je tu ale jedna podmínka. Posluchač musí mít schopnost poslouchat. Vezměme si příklad z firmy. Nadřízený si vybere, kdo ho bude poslouchat - může jich být i více (zaregistruje si ho jako posluchače) a tomu (těm) bude posílat zprávy (objekt události). Pokud ale daný podřízený neumí číst, tak mu nadřízený může posílat co chce, ale reakce se nedočká. Stejného výsledku by dosáhl, pokud by si za posluchače zaregistroval akvarijní rybičky.

Zpět k Javě. Máme tlačítko a chceme aby se po jeho stisknutí něco provedlo. Vytvoříme si tedy objekt a tlačítko si ho zaregistruje jako posluchače. To aby daný objekt měl schopnost naslouchat zajistíme tak, že bude implementovat rozhraní, které mu dá schopnost naslouchat událostem vytvořeným tlačítkem. Následně už jen naprogramujeme to, co chceme aby se po odeslání události (zprá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.");
        }
    }
}
Událost tlačítka v Javě - Tvorba her v Java Swing
Událost tlačítka v Javě - Tvorba her v Java Swing

Začneme od konce.

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

Vytvoříme třídu posluchače pro tlačítko (zde ho vytváříme jako třídu ve třídě). Můžeme ho ale klidně vytvořit jako samostatnou třídu v samostatném souboru. Pro zjednodušení jsem se rozhodl pro toto řešení. JButton vytváří události (objekty, zprávy) typu ActionEvent. Aby na ně mohl posluchač reagovat, musí implementovat rozhraní ActionListener. Toto rozhraní má jedinou metodu actionPerformed(Ac­tionEvent e), do které se naprogramuje to, co má posluchač po obdržení zprávy (události) dělat (metodu překrýváme, proto to označení @Overrride). V tomto případě změníme text na JLabelu z "Tady je návěstí" na "Stisknul jsi tlačítko.". Parametr ActionEvent (což je ta vlastní zpráva s informacemi o tom kdo ji vytvoříl atd.) zde nevyužíváme. Stačí nám, že zpráva došla.

PosluchacTlacitka posluchac = new PosluchacTlacitka();

Vytvoříme nový objekt typu PosluchacTlacitka.

tlacitko.addActionListener(posluchac);

Tlačítko si objekt typu PosluchacTlacitka zaregistruje jako svého posluchače, kterému bude zasílat události (zprávy).

Tento způsob reakcí na události je stejný, co se mění jsou typy událostí. V dalším díle se podíváme na události generované klávesnicí.

V příští lekci, Programování jednoduchých Java GUI her - Události 2, budeme pokračovat v událostech a ukážeme si reakci na stisknutí klávesy.


 

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

 

Předchozí článek
Programování jednoduchých Java GUI her - Obrázky
Všechny články v sekci
Tvorba her v Java Swing
Přeskočit článek
(nedoporučujeme)
Programování jednoduchých Java GUI her - Události 2
Článek pro vás napsal vita
Avatar
Uživatelské hodnocení:
18 hlasů
vita
Aktivity