Anfängerfrage: Plazierung Panel im JFrame und KeyLIstener

Status
Nicht offen für weitere Antworten.
C

c0CoKabAnA

Gast
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:
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
 
C

c0CoKabAnA

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

SlaterB

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

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

Niki

Top Contributor
verwende keinen KeyListener sonder die KeyStrokes:
Code:
		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

Aktives Mitglied
also ich kenn zwar keyStroke nicht, aber ich würde trotzdem keylistener empfehlen, aber halt nicht mit keytyped, sondern pressed und released.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben