# KeyListener und JPanel



## Gast (4. Okt 2007)

Hi,
ich versteh es nicht...


```
public Engine(int breite, int hoehe, int xanzahl, int yanzahl){
		....
		this.addKeyListener(this);
		...
	}

	public void setPanel(ImagePanel panel){
		this.getContentPane().removeAll();
	    this.getContentPane().add(panel);
	    this.getContentPane().validate();
	}

class ImagePanel extends JPanel{ 
	Image image; 
    
	public ImagePanel(int nr,Image[] texture){
		this.image=texture[nr];
		this.setLayout(null);
		this.setSize(640, 480);
        setOpaque(false); 
    } 
    public void paintComponent(Graphics g){ 
    	g.drawImage(image, 0,0, this); // Erst das Bild malen 
    	super.paintComponent(g); // Dann den Rest (Buttons und andere Children) 
    }
}
```

Der Keylistener geht nicht mehr? Wieso das auf einmal...dachte mir vllt das er durch das "removeAll()" gelöscht wird, ist aber nicht der Fall. Es muss was mit denn Panels zu tuen haben. Aber es geht nicht  :cry: [/code]


----------



## madboy (4. Okt 2007)

Der KeyListener ging aber mal? 
- was hast du gemacht? Falls "nix": es müsste immer noch gehen ;-)
- was ist "this" (Panel, Button, ...)?
- hat das Panel, auf dem du den Listener hast auch den Fokus und ist "fokussierbar"? (setFocusable)

Alles in allem: mehr Code bitte. Aber nicht den ganzen Code, sondern ein minimales, lauffähiges Beispiel, an dem sich das Problem nachvolliziehen lässt.


----------



## Quaxli (5. Okt 2007)

Poste mal den Teil, wo Du das KeyListener-Interface implementierst


----------



## Gast (5. Okt 2007)

So guten Morgen ;-)

also hier mal bissel Quelltext...wird aber nicht zum kompiliren gehen.



```
public class IMoY {
	   public static void main(String[] args){
		   Engine fenster = new Engine(640,480,20,15);
		   IMoY_Interact run = new IMoY_Interact(fenster);
		   run.setPanel(0);
	       fenster.setVisible(true);
	   }
}


public class IMoY_Interact {
	int label=0;
	Engine fenster; 
	Player spieler;
	
	
	public IMoY_Interact(Engine fenster){
		this.fenster=fenster;
	}
	
	public void setPanel(int label){
		MakePanels mp=new MakePanels(fenster);
		switch (label) {
		case 0:fenster.setPanel(mp.make_menu());break;
		case 1:fenster.setPanel(mp.make_auswahl());break;
		case 2:fenster.setPanel(mp.make_auswahlsamu());break;
		case 3:fenster.setPanel(mp.make_auswahlgeisha());break;
		case 4:fenster.setPanel(mp.make_auswahlninja());break;
		case 100:fenster.setPanel(mp.make_spielfeld(spieler.gebiet));break;
		default:break;
		}
	}	
}

class Engine extends JFrame implements KeyListener{
	...
	
	public Engine(int breite, int hoehe, int xanzahl, int yanzahl){
		...
		this.addKeyListener(this);
		...

	}
	
	public void setPanel(ImagePanel panel){
		this.getContentPane().removeAll();
	    this.getContentPane().add(panel);
	    this.getContentPane().validate();
	}

	public void keyReleased(KeyEvent ke){
	}
	public void keyTyped(KeyEvent ke){
	}
	public void keyPressed(KeyEvent ke){
		int key = ke.getKeyCode();
		System.out.println("key");
		//if(laufen)System.out.println("key");
	}
}

public class MakePanels extends IMoY_Interact {
	ImagePanel ip;
	JButton[] blist;
	Image[] texture;
	Image[] maps;
	JTextField name=new JTextField();
	
		
	public MakePanels(Engine fenster){
		super(fenster);
		Buttonloader bl=new Buttonloader();
		this.blist=bl.loadbuttons("texture/buttons/buttons.cfg");
		Textureloader t=new Textureloader();
		texture=t.loadtexture("texture/texture.cfg");
		maps=t.loadtexture("maps/maps.cfg");
	}
	
	public ImagePanel make_menu(){
		ip= new ImagePanel(0,texture);
		blist[0].addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				setPanel(1);
				}
		});
		for(int i=0;i<4;++i)ip.add(blist[i]);
		return ip;
	}


class ImagePanel extends JPanel{ 
	Image image; 
    
	public ImagePanel(int nr,Image[] texture){
		this.image=texture[nr];
		this.setLayout(null);
		this.setSize(640, 480);
        setOpaque(false); 
    } 
    public void paintComponent(Graphics g){ 
    	g.drawImage(image, 0,0, this); // Erst das Bild malen 
    	super.paintComponent(g); // Dann den Rest (Buttons und andere Children) 
    }
}
```

So mal sehen ob echt das weiterhilft. Beim Quellcode ist natürlich schon viel weggelassen...ist sonnst schon parr 1000Zeilen lang ;-) Bzw fehlen euch eh die ganzen Texturen/cfg's.

Muss ich denn KeyListener aufs Panel adden? Im moment steht der aufm dem ganzen Fenster, was früher auch klappte...bis ich es mit Panels gemacht habe.


----------



## martinyyyy (1. Mai 2009)

das thema hier ist zwar alt.. aber ich habe genau das selbe problem.

hatte zuvor keinen button und alles hat problemlos funktioniert, hab nun aber zum starten meines spieles einen button hinzugefügt und nun funktioniert: this.addKeyListener nicht mehr, auch die auskommentierte schleife bringt keinen unterschied.


```
private void jbInit() throws Exception {
		this.add(button);
		button.addActionListener(this);
	}

	public void actionPerformed(ActionEvent e) {
		starteSpiel();		
	}

	private void starteSpiel(){
		button.setVisible(false);
		this.repaint();
//		for(Component c:frame.getComponents()){
//			c.addKeyListener(this);
//		}
                this.addKeyListener(this);
	}
	public void keyReleased(KeyEvent e){...}
	public void keyPressed(KeyEvent e){...}
	public void keyTyped(KeyEvent e){...}
```

edit// achja. ich habe sonst keine panels, buttons etc. ich zeichne direkt auf das applet.


----------



## André Uhres (1. Mai 2009)

Versuch's mal mit button.setFocusable(false)


----------



## martinyyyy (1. Mai 2009)

tatsächlich. danke


----------

