IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

6. diel - Programovanie jednoduchých Java GUI hier - Udalosti 2

V tomto diele budeme pokračovať v udalostiach.

Udalosti - pokračovanie

V predchádzajúcom diele sme si povedali, že udalosti typu ActionEvent (napríklad stlačenie tlačidla) sú smerované na poslucháča národné implementačné rozhraní ActionListener. Tento poslucháč potom musí implementovať metódu actionPerformed, v ktorej sa potom uvádza, čo sa má po vzniku udalosti ActionEvent vykonať.

Teraz si ukážeme udalosť typu KeyEvent, ktorá vzniká stlačením / pustením tlačidla na klávesnici a ako na ňu reagovať.

import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PanelUdalosti extends JPanel {
    private JLabel navesti;

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

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

        PosluchacPanelu posluchacPanelu = new PosluchacPanelu();
        this.addKeyListener(posluchacPanelu);

        // komponenta získá fokus
        this.setFocusable(true);
    }

    private class PosluchacPanelu implements KeyListener {
        @Override
        public void keyPressed(KeyEvent e) {
            navesti.setText("Stisknul jsi klávesu.");
        }

        @Override
        public void keyReleased(KeyEvent e) {
            navesti.setText("Pustil jsi klávesu.");
        }

        @Override
        public void keyTyped(KeyEvent e) {
            //is only generated if a valid Unicode character could be generated.
        }
    }
}

Opäť začneme od konca.

private class PosluchacPanelu implements KeyListener {
    @Override
    public void keyPressed(KeyEvent e) {
        navesti.setText("Stisknul jsi klávesu.");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        navesti.setText("Pustil jsi klávesu.");
    }

    @Override
    public void keyTyped(KeyEvent e) {
        //is only generated if a valid Unicode character could be generated.
    }
}

Vytvoríme si triedu, ktorej objektu potom budeme zasielať správy (udalosti) generované stlačením klávesy na klávesnici. Tento objekt musí implementovať rozhranie KeyListener (poslucháč klávesov).

Pri implementovanie tohto rozhrania treba predefinovať tri metódy.

public void keyPressed(KeyEvent e)

Čo sa má vykonať pri stlačení klávesy.

public void keyReleased(KeyEvent e)

Čo sa má vykonať, keď je kláves pustená.

public void keyTyped(KeyEvent e)

Čo sa má vykonať pri stlačení bežnej klávesy (klávesa, ktorá reprezentuje znak).

PosluchacPanelu posluchacPanelu = new PosluchacPanelu();

Vytvorenie objektu typu PosluchacPanelu.

this.addKeyListener(posluchacPanelu);

Týmto riadkom kódu si JPanel registruje posluchacPanelu ako svojho poslucháča, ktorému bude zasielať správy (udalosti). Možno písať aj bez kľúčového slova this.

this.setFocusable(true);

Aby komponenta mohla generovať udalosti KeyEvent, musí mať zameranie (focus). Týmto pridávame focus komponente JPanel. Na toto si dávajte pozor. Pokiaľ na focus zabudnete, program sa normálne spustí, vstup z klávesnice ale nefunguje.

@Override
    public void keyTyped(KeyEvent e) {
    }

Ešte sa vrátim k metóde keyTyped (). Tá je volaná pri stlačení klávesy reprezentujúci znak. Pre túto metódu nemáme žiadne použitie, ale pretože je súčasťou rozhranie KeyListener, ktoré implementujeme, musíme implementovať aj túto metódu.

A takto vyzerá náš výsledok.

Udalosti klávesnice v Jave - Tvorba hier v Java Swing
Udalosti klávesnice v Jave - Tvorba hier v Java Swing
Udalosti klávesnice v Jave - Tvorba hier v Java Swing

Doteraz sme nikdy nevyužili objektu správy (udalosti). U JButton to bol objekt ActionEvent, pri klávesnici KeyEvent. V nasledujúcom príklade si ukážeme, ako možno s týmito objektmi pracovať.

import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PanelUdalosti extends JPanel {
    private JLabel navesti;

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

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

        PosluchacPanelu posluchacPanelu = new PosluchacPanelu();
        this.addKeyListener(posluchacPanelu);
        this.setFocusable(true);
    }

    private class PosluchacPanelu implements KeyListener {
        @Override
        public void keyPressed(KeyEvent e) {
            navesti.setText("Stisknul jsi klávesu: " + e.getKeyChar());
        }

        @Override
        public void keyReleased(KeyEvent e) {
            navesti.setText("Pustil jsi klávesu jejíž číselný kód je: " + e.getKeyCode());
        }

        @Override
        public void keyTyped(KeyEvent e) {
            //is only generated if a valid Unicode character could be generated.
        }
    }
}

Až na dva riadky tu nie je nič nové.

navesti.setText("Stisknul jsi klávesu: " + e.getKeyChar());

Volanie metódy getKeyChar () objektu KeyEvent. Metóda vracia znak priradený danej klávese.

navesti.setText("Pustil jsi klávesu jejíž číselný kód je: " + e.getKeyCode());

Volanie metódy getKeyCode () objektu KeyEvent. Metóda vracia číselný kód priradený danej klávese.

Udalosti klávesnice v Jave - Tvorba hier v Java Swing
Udalosti klávesnice v Jave - Tvorba hier v Java Swing
Udalosti klávesnice v Jave - Tvorba hier v Java Swing
Udalosti klávesnice v Jave - Tvorba hier v Java Swing
Udalosti klávesnice v Jave - Tvorba hier v Java Swing

Z objektu udalosti možno získať veľa informácií. Pre nás je najdôležitejšie, že pomocou objektu udalosti, môžeme od seba rozlíšiť jednotlivé klávesy. Dokážeme presne povedať, ktorá klávesa bola stlačená (pustená) a môžeme určiť, ako sa má náš program správať pri stlačení (alebo pustenie) určitých klávese.


 

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

 

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