Lekce 6 - Programování jednoduchých Java GUI her - Události 2
V předchozí lekci, Programování jednoduchých Java GUI her - Události, jsme se podívali na to, co jsou to události a jak se v Javě používají.
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.



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.





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.
V příští lekci, Programování jednoduchých Java GUI her - Časovač, si rozpohybujeme objekt na JPanelu a pomocí časovače si vytvoříme animaci.
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 267x (2.5 kB)
Aplikace je včetně zdrojových kódů v jazyce Java