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

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

V tomto díle budeme pokračovat v událostech.

Události - pokračování

V předchozím díle jsme si řekli, že události typu ActionEvent (například stisknutí tlačítka) jsou směrovány na posluchače implementující rozhraní ActionListener. Tento posluchač pak musí implementovat metodu ActionPerformed, ve které se pak uvádí, co se má po vzniku události ActionEvent provést.

Nyní si ukážeme událost typu KeyEvent, která vzniká stisknutím/puštěním tlačítka na klávesnici a jak na ni reagovat.

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ět začneme od konce.

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

Vytvoříme si třídu, jejíž objektu potom budeme zasílat zprávy (události) generované stiskem klávesy na klávesnici. Tento objekt musí implementovat rozhraní KeyListener (posluchač kláves).

Při implementování tohoto rozhraní je třeba předefinovat tři metody.

public void keyPressed(KeyEvent e)

Co se má provést při stisku klávesy.

public void keyReleased(KeyEvent e)

Co se má provést, když je klávesa puštěna.

public void keyTyped(KeyEvent e)

Co se má provést při stisku běžné klávesy (klávesa, která reprezentuje znak).

PosluchacPanelu posluchacPanelu = new PosluchacPanelu();

Vytvoření objektu typu PosluchacPanelu.

this.addKeyListener(posluchacPanelu);

Tímto řádkem kódu si JPanel registruje posluchacPanelu jako svého posluchače, kterému bude zasílat zprávy (události). Lze psát i bez klíčového slova this.

this.setFocusable(true);

Aby komponenta mohla generovat události KeyEvent, musí mít zaměření (focus). Tímto přidáváme focus komponentě JPanel. Na toto si dávejte pozor. Pokud na focus zapomenete, program se normálně spustí, vstup z klávesnice ale nefunguje.

@Override
    public void keyTyped(KeyEvent e) {
    }

Ještě se vrátím k metodě keyTyped(). Ta je volána při stisknutí klávesy reprezentující znak. Pro tuto metodu nemáme žádné použití, ale protože je součástí rozhraní KeyListener, které implementujeme, musíme implementovat i tuto metodu.

A takhle vypadá náš výsledek.

Události klávesnice v Javě
Události klávesnice v Javě
Události klávesnice v Javě

Doposud jsme nikdy nevyužili objektu zprávy (události). U JButtonu to byl objekt ActionEvent, u klávesnice KeyEvent. V následujícím příkladu si ukážeme, jak lze s těmito objekty pracovat.

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 řádky zde není nic nového.

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

Volání metody getKeyChar() objektu KeyEvent. Metoda vrací znak přiřazený dané klávese.

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

Volání metody getKeyCode() objektu KeyEvent. Metoda vrací číselný kód přiřazený dané klávese.

Události klávesnice v Javě
Události klávesnice v Javě
Události klávesnice v Javě
Události klávesnice v Javě
Události klávesnice v Javě

Z objektu události lze získat mnoho informací. Pro nás je nejdůležitější, že pomocí objektu události, můžeme od sebe rozlišit jednotlivé klávesy. Dokážeme přesně říci, která klávesa byla stisknuta (puštěna) a můžeme určit, jak se má náš program chovat při stisku (nebo puštění) určitých klávese.


 

Stáhnout

Staženo 227x (2.5 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 (3 hlasů) :
55555


 



 

 

Komentáře

Avatar
Honza182
Člen
Avatar
Honza182:

Ahoj, mám problém se čtením kláves. Metoda getKeyChar() mi funguje bez problémů a vrací správně znaky, které zmáčknu.

Po přidání metody getKeyCode() se mi ale skoro u žádné klávesy nezobrazuje ani hláška "Pustil jsi klávesu s číselným kódem:", kromě Backspacu, u kterého ukazuje kód 8 a asi tří kláves se speciálními znaky vedle Enteru, které ukazují kód 0. Tak jsem se chtěl zeptat, jestli třeba někdo neví čím to je?

Jo a moc děkuju vita za sepsání tutorialu, hodně mi pomáhá.

Editováno 7. října 17:02
Odpovědět 7. října 17:01
Éhoj
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 1 zpráv z 1.