5. díl - Programování jednoduchých Java GUI her - Události

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

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ě

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ě
Událost tlačítka v Javě

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


 

Stáhnout

Staženo 244x (2.23 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

  Aktivity (1)

Článek pro vás napsal vita
Avatar
vita

Jak se ti líbí článek?
Celkem (6 hlasů) :
4.333334.333334.333334.33333 4.33333


 



 

 

Komentáře

Avatar
Benjibs
Člen
Avatar
Benjibs:

Neviem, či je to tým, že som Slovák, ale celkom ma pri JLabeli zaráža pojem "návestie"

Odpovědět  +1 23.9.2013 16:18
1 + 1 = 2
Avatar
vita
Redaktor
Avatar
Odpovídá na Benjibs
vita:

Label se dá přeložit následovně: štítek, známka, návěstí, značka, visačka, nálepka, .... Možná jsem mohl použít jako název proměnné stitek nebo nalepka, ale použil jsem navesti. Herout ve své knize Java grafické uživatelské prostředí a čeština označuje Label jako návěští.

 
Odpovědět  +1 23.9.2013 18:19
Avatar
Benjibs
Člen
Avatar
Odpovídá na vita
Benjibs:

Tak potom OK, ako je jasné, české ekvivalenty pre rôzne slová mi príliš nejdú :)
(ale mohol by si sa držať najčastie využívaného prekladu, aby sa predošlo prípadným nedorozumeniam)

Odpovědět 23.9.2013 18:34
1 + 1 = 2
Avatar
richi.anden
Člen
Avatar
richi.anden:

Vysvetlene zatial najlepsie a najpochopitel­nejsie. SUPER!

 
Odpovědět 14.11.2013 22:03
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 4 zpráv z 4.