KeyListener

B

ByeBye 249712

Hallo,

Ich habe diese Klasse zum KeyListener erstellt. Wenn ich sie ausführe dann öffnet sich einfach nur ein weises Fenster, erscheinen müsste aber ein Kreis, in diesem Fenster, den man über die Tastatur bewegen kann. Kann mir da jemand weiterhelfen was ich an dem Code verändern muss damit das ganze läuft. Vielen Dank



Hier der Code:


import javax.swing.*;
import java.awt.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.*;

public class second extends JPanel implements ActionListener, KeyListener {

Timer t = new Timer (5, (ActionListener) this);
double x = 0, y = 0, velx = 0, vely =0;

public second(){
t.start();
addKeyListener((KeyListener) this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}

public void paintComponents(Graphics g){

super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.fill(new Ellipse2D.Double(x, y, 40, 40));


}
public void actionPerformed(ActionEvent e){
repaint();
x += velx;
y += vely;

}

public void up() {
vely= -1.5;
velx= 0;
}

public void down() {
vely= 1.5;
velx= 0;
}



public void left() {
velx= -1.5;
vely= 0;
}



public void right() {
velx= 1.5;
vely= 0;
}

public void keyPressed(KeyEvent e){
int code = e.getKeyCode();
if (code == KeyEvent.VK_UP){
up();
}
if (code == KeyEvent.VK_DOWN){
down();
}
if (code == KeyEvent.VK_RIGHT){
right();
}
if (code == KeyEvent.VK_LEFT){
left();
}
}
public void keyTyped(KeyEvent e) {

}
public void keyReleased(KeyEvent e){

}
}
 
Willkommen bei tutorials.de :)

Zuerst einmal: Bitte schreib deinen Code zukünftig zwischen [code=java]...[/code], damit wirds lesbarer.

Zu deinem Code:
1)Warum überschreibst du paintComponents?
Nimm paint statt paintComponents, und in der Methode auch entsprechend super.paint statt super.paintComponents.

2)Die Methode actionPerformed und alles rund um den Timer t kannst du dir auch sparen, wenn die drei Zeilen Inhalt von actionPerformed ans Ende von keyPressed (ausserhalb der if´s) gibst.

3) Eben bei diesen drei Zeilen würde ich repaint als letztes aufrufen, also die Koordinaten zuerst verändern.

Das wars.
Jetzt hast du einen schwarzen Kreis, den du mit den Pfeiltasten steuern kannst.
 
cool danke, mit paint statt paintComponents hats funktioniert. Auf so Plumpe Sachen komm ich meistens nicht.
Allerdings, bewegt sich der Kreis nicht sondern hängt in der linken oberen Ecke fest wenn ich den Timer wegnehm und den Inhalt von actionPerformed ans Ende von keyPressed setze.
Bin noch Anfänger im Java coden und hab den Code selbst größtenteils übernommen, aus diesem Grund versteh ich das mit dem Timer auch irgendwie nicht, aber naja, zumindest funktionierts. :)
 
Hast du Punkt 3 auch gemacht?
Bei mir funktionierts, ich kann den Kreis bewegen.

Poste sonst deinen geänderten Quelltext nocheinmal, am besten gleich mit der anderen Datei (in der das Main ist).
 
Zuletzt bearbeitet:
Ich glaube so hast du es gemeint, jedoch bewegt sich hierbei der Kreis nicht von alleine, und das sollte passieren, vielleicht hab ich aber auch noch was übersehen.

Der Punkt soll sich übrigens auf einem Spielfeld bewegen welches mit hilfe der hinzugefügten for-Schleifen, in der paint Methode, realisiert wird.
Allerdings is hier noch irgendwo der Wurm drin, irgendwie is hier der background schwarz und der
Kreis grau, wenn ich auf ausführen gehe; dabei soll der background aus roten Kästchen auf schwarzem hintergrund bestehn und der Kreis müsste ebenfalls schwarz sein. Komisch!

Vielleicht hast du da nochn Tip wie man das lösen kann.

Vielen Dank

also hier die classe second:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.Event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.*;

public class second extends JPanel implements ActionListener, KeyListener {


	double x = 0, y = 0, velx = 0, vely =0;
	
	public second(){
		addKeyListener((KeyListener) this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(false);
	}

	public void paint(Graphics g){
		
		
		this.setBackground(Color.BLACK);
		
		super.paint(g);
		
		g.setColor(Color.RED);
		
		int w = getWidth();
		
		int z = getHeight();
		
		for (int x = 0; x < w; ++x) {
		
			for (int y = 0; y < z; ++y) {
				g.fillRect(x * 50 + x, y * 50 + y, 50, 50);
		
			}}
		
	
		super.paint(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.fill(new Ellipse2D.Double(x, y, 40, 40));
	
		
		
}
	
	
	public void up() {
		vely= -1.5;
		velx= 0;
	}
	
	public void down() {
		vely= 1.5;
		velx= 0;
	}
	
	
	
	public void left() {
		velx= -1.5;
		vely= 0;
	}
	
	
	
	public void right() {
		velx= 1.5;
		vely= 0;
	}
	
	public void keyPressed(KeyEvent e){
		int code = e.getKeyCode();
		if (code == KeyEvent.VK_UP){
			up();
		}
		if (code == KeyEvent.VK_DOWN){
			down();
		}
		if (code == KeyEvent.VK_RIGHT){
			right();
		}
		if (code == KeyEvent.VK_LEFT){
			left();
		}
		
		repaint();
		x += velx;
		y += vely;
		
	}
	public void keyTyped(KeyEvent e) {
		
	}
	public void keyReleased(KeyEvent e){
		
	}
}



und hier ist die Mainklasse:
Java:
import javax.swing.JFrame;

public class key {
	
	public static void main(String args[]){
		JFrame f = new JFrame();
		second s = new second();
		f.add(s);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(800,600);
	}
	
}
 
Soll nen Spiel werden. Nennt sich Liz Race. Zwei Schlangen bewegen sich von alleine auf dem Spielfeld. Beide Spieler steuern je eine Schlange mit der Tastatur, wobei sie sich nicht berühren dürfen, sonst is game over.
 
Zurück