Helmichs Informatik-Lexikon

Tastatursteuerung

Folgende Anwendung zeigt an einem sehr einfachen Beispiel, wie man die vier Pfeiltasten (und alle anderen Tasten) auswerten kann:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Tastatur extends JFrame implements KeyListener
{
    String meldung;
    
    public Tastatur()
    {
        initFrame();
        meldung = new String("...");      
    }

    public void initFrame()
    {
        setSize(520,520);
        setTitle("Test der Taststursteuerung");
        setResizable(false);
        setVisible(true);       
        requestFocus();
        addKeyListener(this);
    }    

    public void keyTyped(KeyEvent k)  {}
    
    public void keyPressed(KeyEvent k) 
    {
        switch (k.getKeyCode()) 
        {
            case 38: meldung = "go north"; break;
            case 40: meldung = "go south"; break;
            case 37: meldung = "go west";  break;
            case 39: meldung = "go east";  break;
            default: meldung = "code "+k.getKeyCode();	
        }
        repaint();
    }

    public void keyReleased(KeyEvent k)  {}
    
    public void paint(Graphics g)
    {
       g.setColor(Color.WHITE);
       g.fillRect(0,0,500,500);
       g.setColor(Color.RED);
       if (meldung != null)
          g.drawString(meldung,20,50);
       else
          g.drawString("error",20,50);
    }

    public static void main(String[] args) 
    {
        new Tastatur();
    }    
}

Wichtig ist am Anfang, dass der Anwendung ein KeyListener zur Verfügung gestellt wird. Wenn Sie eine Anwendung um das Interface KeyListener erweitern, müssen Sie drei Methoden dieser Klasse überschreiben, nämlich keyTyped(), keyPressed() und keyReleased().

Für unser kleines Demo-Programm reicht es, wenn wir die Methode keyPressed() mit Code füllen. Die Information, welche Taste gerade gedrückt wurde, steckt in dem Parameter k vom Typ KeyEvent. Dieses Objekt k hat eine Methode getKeyCode(), die uns den Code der gerade gedrückten Taste liefert. Der Code für die Pfeil-hoch-Taste ist beispielsweise 38. Wenn diese Taste gedrückt wurde, wird das Attribut meldung auf den Wert "go north" gesetzt, weil die Hauptfigur eines Spiels nach Norden gehen soll, wenn die Pfeil-hoch-Taste gedrückt wird.

Am Ende von keyPressed() wird dann repaint() aufgerufen, damit die Anwendung neu gezeichnet wird. In der paint()-Methode wird dann das Anwendungsfenster zunächst gelöscht, und dann wird der String meldung an der Position 20,50 ausgegeben.

Kleine Anekdote am Rande:

Beim Testen des Programms wurde eine ganze Zeit lang überhaupt nichts angezeigt, bis ich merkte, dass ich den drawString()-Befehl mit einem y-Wert von 20 benutzt hatte. Die ersten 20 Pixel einer Java-Anwendung werden jedoch von der Menüzeile des Fensters beansprucht, daher wurde nichts angezeigt. Erst als ich den Wert auf y=50 erhöhte, konnte man die Meldung sehen.

Zur initFrame()-Methode

In der initFrame()-Methode der Anwendung wird zunächst einmal die eigene setVisible()-Methode aufgerufen. An sich ist das nicht notwendig, manchmal gibt es aber Probleme mit dem Anzeigen des Anwendungsfensters, und mit setVisible() sollen solche Probleme vermieden werden. Ähnlich ist es mit requestFocus(). Während der Entwicklung des Spiels tauchte das Problem auf, dass das Spielbrett erst dann im Anwendungsfenster angezeigt wurde, wenn ein Button angeklickt wurde, weil einer der Buttons den Fokus hatte und nicht die Zeichenfläche. Mit requestFocus() sichert sich aber die Zeichenfläche die Aufmerksamkeit. Wenn man ganz sicher gehen will, kann man am Ende von initFrame() auch noch ein repaint() einbauen, dann wird auf jeden Fall sofort die paint()-Methode aufgerufen.