# KeyListener Funktioniert nicht



## StrikeTom (13. Jun 2010)

Hallo Leute,
ich habe den Fehler noch nicht gefunden und deshalb frage ich hier mal nach:
Warum funktioniert der KeyListener nicht:

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;

public class GamePanel extends JPanel implements KeyListener
{
	Spieler spieler;
	public GamePanel(final Spieler spieler)
	{
		this.spieler = spieler;
		this.addKeyListener(this);
	}
	public void keyPressed(KeyEvent e)
	{
		if (e.getKeyCode() == KeyEvent.VK_UP)
        {
			spieler.hochBewegung();
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT)
        {
        	spieler.rechtsBewegung();
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT)
        {
        	spieler.linksBewegung();
        }
        if (e.getKeyCode() == KeyEvent.VK_W)
        {
        	spieler.hochBewegung();
        }
        if (e.getKeyCode() == KeyEvent.VK_D)
        {
        	spieler.rechtsBewegung();
        }
        if (e.getKeyCode() == KeyEvent.VK_A)
        {
        	spieler.linksBewegung();
        }
        if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
        {
        	 System.exit(0);
        }
       }
	 public void paintComponent(Graphics g) 
     {
         super.paintComponent(g);
         this.setBackground(Color.white);
         this.repaint();
         spieler.draw(g);
     }
	
	public void keyReleased(KeyEvent arg0){}
	public void keyTyped(KeyEvent arg0){}
}
```
Und die Main:

```
import javax.swing.JFrame;

public class Main
{
	public static void main(String[] args)
	{
		Spieler s = new Spieler(100, 100);
		GamePanel g = new GamePanel(s);
		JFrame f = new JFrame("Game");
		f.setSize(500, 500);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.add(g);
		f.setVisible(true);
	}
}
```
An der Klasse Spieler liegt es nicht, da ich auch keine anderen aktionen mit Tasten ausführen kann. (Siehe Zeile 42-45)

Danke im voraus


----------



## dku (13. Jun 2010)

probier im Konstruktor vom Panel einfach mal vor dem Listener

```
this.setFocusable(true);
```

Gruß,
David


----------



## Quaxli (14. Jun 2010)

Ich würde danach noch ein requestFocus() hinhängen - vorsichtshalber.

Noch ein paar Anmerkungen zum Code:

Der repaint-Aufruf in der paitnComponent-Methode hat da nichts verloren.


```
public void paintComponent(Graphics g) 
     {
         super.paintComponent(g);
         this.setBackground(Color.white);
         this.repaint();    <---------------  weg damit
         spieler.draw(g);
     }
```

Repaints triggert man üblicherweise aus einem separaten Thread an.


Der folgende Code sieht für mich auch nicht gut aus:


```
if (e.getKeyCode() == KeyEvent.VK_UP)
        {
            spieler.hochBewegung();
        }
```

Ich unterstelle mal, daß in der Klasse Spieler dann Code steht, der ungefähr so aussieht: spieler.y = spieler.y - 1 (oder so). Damit wirst Du spätestens Probleme kriegen, wenn Du mehr als eine Taste drücken willst. Meist geht man so vor, daß man im KeyListener nur boolean-Werte verändert und diese im GameLoop abfragt.

Die separate Klasse Main ist im Prinzip nicht nötig. Genaus könntest du sowas wie im u. a. Beispiel  basteln. Das soll jetzt aber nicht heißen, daß das falsch ist - wobei der Konstruktor mit der finalen Spieler-Variable a) für mich augenfeindlich ist   und b) ich mir vorstellen könnte, daß das später noch zu Problemen führt. 


```
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

public class GamePanel extends JPanel implements KeyListener {
	

	Rectangle	rectangle;
	JFrame f;

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


	public GamePanel() {
    rectangle = new Rectangle(10,10,10,10);
		this.addKeyListener(this);
    this.setFocusable(true);
    this.requestFocus();
		
		f = new JFrame("Game");
		f.setSize(500, 500);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.add(this);
		f.setVisible(true);

	}

	public void keyPressed(KeyEvent e) {
		
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			System.out.println("up");
		}
		
    //usw
    .....
		
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		this.setBackground(Color.white);
		//this.repaint();  hat hier nix verloren
    //usw
    ....
	}

   ....
}
```

Die Klasse Spieler hatte ich natürlich nicht, daher habe ich die kurzfristig mal durch Rectangle ersetzt, damit ich testen konnte, ob es lauffähig ist - also nix dabei denken (oder daß nächste mal gleich ein kompilierbares Beispiel posten )


----------



## StrikeTom (14. Jun 2010)

Danke, ich werds mir mal angucken


----------

