# keylistener funktioniert nicht



## hdi (1. Feb 2008)

hallo,
ich habe versucht an hand eines beispiels von ariol einen keylistener in mein programm einzubauen, allerdigns funktioniert er nicht.

hier ist der code:


```
import javax.swing.JComponent;
import java.awt.Graphics;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Label;
import java.awt.FlowLayout; 
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class View extends JFrame{
	
	private GraphicsPanel panel;
	private Label label;
	
    public void sleep(long millis) {
	try {Thread.sleep(millis);} catch (Exception e){}
    }

	public View(Worm w){
		super();
		setLayout(new FlowLayout());
      	setDefaultCloseOperation(EXIT_ON_CLOSE); 

        panel = new GraphicsPanel(this, w);
        panel.setPreferredSize(new Dimension(Data.HOR_RES, Data.VER_RES));
      	add(panel);
      	
      	label = new Label();
      	add(label);

      	setFocusable(true);
      	pack();
      	setVisible(true);
	}
}

class GraphicsPanel extends JPanel implements KeyListener{
	
	private Worm w;
	private View v;
	
	/**
	 * @Override
	 */ 
	protected void paintComponent(Graphics g){
		super.paintComponent(g);
     	w.draw(g);
	}
	
    public void keyPressed(KeyEvent e)
    {
         System.out.println("taste gedrückt."); // <--------------------- erscheint nicht.
         int key = e.getKeyCode();
         if (key == KeyEvent.VK_UP){
            w.move(Data.UP);
            v.repaint();}
         else if (key == KeyEvent.VK_RIGHT){
            w.move(Data.RIGHT);
            v.repaint();}
         else if (key == KeyEvent.VK_DOWN){
            w.move(Data.DOWN);
            v.repaint();}
         else if (key == KeyEvent.VK_LEFT){
            w.move(Data.LEFT);
            v.repaint();}
    }
	
      public void keyReleased(KeyEvent e)
      {
      }
      public void keyTyped(KeyEvent e)
      {
      }
      
	/**
	 * CONSTRUCTOR
	 */
	GraphicsPanel(View v,Worm w){
		this.v = v;
		this.w = w;
		addKeyListener(this);
	}
}
```

in einer anderen klasse hab ich meine main-methode, da wird lediglich eine neue Instanz von View() erstellt und das programm dann in einer endlosschleife festgehalten.

die system.out.println meldung, dass ein key gedrückt wurde, erscheint nicht, er startet ihn also irgendwie erst gar nicht?


----------



## hugo (1. Feb 2008)

Kann es daran liegen, dass das entsprechende Panel niemals den Focus hat? Wenn der Focus auf dem JPanel liegt, dann sollte auch der Listener funktionieren. Dazu müsste aber auch das Panel "focusable" sein.


----------



## SlaterB (1. Feb 2008)

und das JFrame nicht mehr, dessen Focusable scheint das JPanel zu überwiegen


----------



## Niki (1. Feb 2008)

Solche Sachen sollten immer über InputMap und ActionMap gemacht werden, dann funktionierts auch!
Such danach im Forum, ich hab sicher schon mindestens drei mal so eine Frage beantwortet...


----------



## Guest (2. Feb 2008)

genau, setFocusable beim JFrame raus und beim JPanel rein.. jetzt geht es! Vielen Dank.


----------

