# Anfängerfrage: Plazierung Panel im JFrame und KeyLIstener



## c0CoKabAnA (26. Mai 2008)

Hi!

Ich versuche mich zur zeit an meinen ersten grafischen spielen!
Nunja ist beireits nichts großes aber die ersten probleme kommen schon...

1tens: Wieso kann ich das Panel nicht dort plazieren wo ich will sondern es hängt sich imer links oben ins eck ein?
2tens: Wieso funtkioniert der KeyListener nicht?

bin schon seit stunden am rumprobieren doch irgendwie ändert sich nie was...

hier der code:

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

import javax.swing.JFrame;
import javax.swing.JPanel;

public class BallApplet extends JFrame implements KeyListener {	
	private static final long serialVersionUID = -4542245838586619925L;

	private int x_pos = 150;
	private int y_pos = 150;
	private int speed = 5;
	private int x_speed = speed;
	private int y_speed = speed;	
	private int radius = 20;
	private JPanel panel = new JPanel();
	private Image dbImage;
	private Graphics dbg;
	
	public static void main(String[] args) {
		new BallApplet();
	}
	
	public BallApplet() {
		setLayout(null);
		setSize(800, 600);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		panel.setBounds(20, 20, 760, 560);
		panel.setBackground(Color.LIGHT_GRAY);
		panel.addKeyListener(this);
		add(panel);
		
		setVisible(true);
		
		run();
	}

	public void run(){
		while( true ) {
			 x_pos += x_speed; 
			 y_pos += y_speed;
			
			 if( x_pos > panel.getWidth() - radius ) {
				 //Bande rechts
				 x_speed = x_speed - speed;
			 } else if( x_pos < radius ){
				 //Bande links
				 x_speed = x_speed + speed;
			 }
			 
			 if( y_pos > panel.getHeight() - radius ) {
				 //Bande unten
				 y_speed = y_speed - speed;
			 } else if( y_pos < radius ){
				 //Bande oben
				 y_speed = y_speed + speed;
			 }
			 
			 if( dbImage == null ) {
				 dbImage = createImage( panel.getSize().width, panel.getSize().height );
			     dbg = dbImage.getGraphics();
			 }
			 
			 dbg.setColor( getBackground() );
			 dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
			 dbg.setColor (getForeground());
			 paint(dbg);
			 
			 getGraphics().drawImage( dbImage, 0, 0, panel );
			 
			 try {
				 Thread.sleep (20);
			 } catch( InterruptedException ex ) {
				 ex.printStackTrace();
			 }
		}
	}
	
	public void paint(Graphics g){
		g.setColor (Color.red);
		g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
	}

	public void keyPressed(KeyEvent arg0) {}
	public void keyReleased(KeyEvent arg0) {}

	public void keyTyped(KeyEvent e) {
		System.out.println("im KeyListener");
		if( e.getKeyCode() == 37 ) {
			System.out.println("Pfeiltaste links");
		}
		if( e.getKeyCode() == 39 ) {
			System.out.println("Pfeiltaste rechts");
		}
	}
}
```

mfg


----------



## c0CoKabAnA (26. Mai 2008)

okay das mit dem panel iim Jframe hat sich erledigt aber der keylistener geht immernoch nicht


----------



## SlaterB (26. Mai 2008)

setVisible(true); 
       panel.requestFocus();
       run();

edit:
keyTyped reagiert nur bei echten Buchstaben, nicht bei den Pfeiltasten, schaue dir auch die anderen Operationen an


----------



## Niki (26. Mai 2008)

verwende keinen KeyListener sonder die KeyStrokes:

```
JPanel panel = (JPanel)getContentPane();
		InputMap im = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
		ActionMap am = panel.getActionMap();

		im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up_arrow");
		am.put("up_arrow", new AbstractAction(){
			public void actionPerformed(ActionEvent e) {
				System.out.println("up_arrow pressed");
				
			}
		});
```


----------



## Lulumann6 (26. Mai 2008)

also ich kenn zwar keyStroke nicht, aber ich würde trotzdem keylistener empfehlen, aber halt nicht mit keytyped, sondern pressed und released.


----------

