jframe erstellen

B

ByeBye 249712

Hallo, ich möchte ein Spielfeld erstellen auf dem sich zwei punkte bewegen lassen.
Allerdings bekomme ich es nicht hin das sich auf einem JFrame 2 Punkte gleichzeitig bewegen. Woran kann das liegen?

Also hier ist die Main:
Java:
import javax.swing.JFrame;

public class startup {
	
	public static void main(String args[]){
		JFrame f = new JFrame();
		keylistener s = new keylistener();
		keylistener2 t = new keylistener2();
		f.add(s);
		f.add(t);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(800,600);
		
		
	}
	
}

Wenn ich dort nur eine der add-Methoden aktiviere dann erscheint oben links der Kreis, wie gewünscht und lässt sich auch mit den dafür vorgesehenen Tastenbelegungen bewegen. Sind jedoch beide add-Methoden aktiv so erscheind ein Kreis oben links und lässt sich aber nicht bewegen. Kann mir jemand sagen warum?


heier die beiden Klassen zum KeyListener:

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 keylistener extends JPanel implements ActionListener, KeyListener {

	Timer t = new Timer (5, (ActionListener) this);
	double x = 0, y = 0, velx = 0, vely =0;
	
	public keylistener(){
		t.start();
		addKeyListener((KeyListener) this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(false);
	}

	public void paint(Graphics g){
		

	
		super.paint(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){
		
	}
}



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 keylistener2 extends JPanel implements ActionListener, KeyListener {

	Timer t = new Timer (5, (ActionListener) this);
	double x = 0, y = 0, velx = 0, vely =0;
	
	public keylistener2(){
		t.start();
		addKeyListener((KeyListener) this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(false);
	}

	public void paint(Graphics g){
	
		super.paint(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_W){
			up();
		}
		if (code == KeyEvent.VK_S){
			down();
		}
		if (code == KeyEvent.VK_D){
			right();
		}
		if (code == KeyEvent.VK_A){
			left();
		}
		
		
	}
	public void keyTyped(KeyEvent e) {
		
	}
	public void keyReleased(KeyEvent e){
		
	}
}
 
Eigentlich ist es egal, ob Canvas, Panel oder sonstwas, das ist hier nicht das Problem. Das Problem ist einfach, dass JFrame standardmäßig das BorderLayout verwendet und wenn man die Methode add() ohne Position verwendet, dann wird das Objekt in den Center-Bereich geklatscht. Da in diesem Fall das zwei mal der Fall ist, ist auch nur das letzte von beiden zu sehen bzw. wohl auch nur vorhanden. Ich weiß grad nicht, wie beim BorderLayout das gehändelt wird, aber ich vermute einfach, dass das erste Panel einfach rausgeschmissen und durch das zweite ersetzt wird, weil anders machts auch kein Sinn, denn wozu sollte man das alte Panel behalten, wenn man damit eh nicht arbeiten kann. Ist auch egal, wie gesagt, das zweimalige Aufrufen der add()-Methode ist hier das Problem und nicht die Vaterklasse.
 
Danke für den Tip, kannst du mir vielleicht noch sagen wie ich meine Mainmethode anpassen muss, die add-methoden funktionieren beim Canvas Element nicht mehr.

Vielen Dank
 
Ja, das zweimalige aufrufen der add-Methode ist das Problem, aber ich muss ja beide Kreise hinzufügen. Die Frage ist ja wie ich es dann sonst lösen kann?!
 
Ich hab jetzt mal alles in eine Klasse gepackt und jetzt erscheinen schon zwei Kreise allerdings kann ich nur einen der beiden steuern. Wäre euch echt dankbar wenn ihr darauf ne Antwort hättet. :)

schöne Grüße

die Main Klasse nochmal:

Java:
import javax.swing.JFrame;


public class startup {
	

	
	public static void main(String args[]){
	    JFrame f = new JFrame();
		keylistener2 t = new keylistener2();
		f.add(t);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(800,600);
		
		
	}
}


und hier die Klasse mit dem Keylistener:
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 keylistener2 extends JPanel implements ActionListener, KeyListener {

	Timer t = new Timer (5, (ActionListener) this);
	double x = 0, y = 0, velx = 0, vely =0;
	double z = 100, q= 100, velz =0, velq = 0;
	
	public keylistener2(){
		t.start();
		addKeyListener((KeyListener) this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(false);
	}

	public void paint(Graphics g){

		super.paint(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.fill(new Ellipse2D.Double(x, y, 40, 40));
	        g2.fill(new Ellipse2D.Double(z,q,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_W){
			up();
		}
		if (code == KeyEvent.VK_S){
			down();
		}
		if (code == KeyEvent.VK_D){
			right();
		}
		if (code == KeyEvent.VK_A){
			left();
		}
		
		
	}
	public void keyTyped(KeyEvent e) {
		
	}
	public void keyReleased(KeyEvent e){
		
	}
	
		
	public void actionPerformed2(ActionEvent e){
		repaint();
		z += velz;
		q += velq;
		
	}
	
	public void up2() {
		velq= -1.5;
		velz= 0;
	}
	
	public void down2() {
		velq= 1.5;
		velz= 0;
	}
	
	
	
	public void left2() {
		velz= -1.5;
		velq= 0;
	}
	
	
	
	public void right2() {
		velz= 1.5;
		velq= 0;
	}
	

	public void keyPressed2(KeyEvent e){
		int code = e.getKeyCode();
		if (code == KeyEvent.VK_UP){
			up2();
		}
		if (code == KeyEvent.VK_DOWN){
			down2();
		}
		if (code == KeyEvent.VK_RIGHT){
			right2();
		}
		if (code == KeyEvent.VK_LEFT){
			left2();
		}
		
		
	}
	public void keyTyped2(KeyEvent e) {
		
	}
	public void keyReleased2(KeyEvent e){
		
	}
}
 
Ein kleiner Tipp für das Anzeigen des Fensters
Der Befehl setVisible sollte immer der letzte sein
Java:
    public static void main(String args[]){
        JFrame f = new JFrame();
        keylistener2 t = new keylistener2();
        f.add(t);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800,600);
        f.setVisible(true);
    }
 
Oehm, probier mal deinen Code aus keyPressed2 in keyPresses zu setzen. Keypressed ist eine Methode die du aus einer vererbten Klases ueberschreibst, dort gibt es gar keine keyPressed2, somit duerfte diese methode gar net aufgerufen werden.
 
Hab ich das jetzt richtig verstanden, einfach KeyPressed2 in KeyPresses umbenennen oder wie?
oder ne neue Klasse erstellen mit KeyPresses? Wies nich genau was ich machen muss.
 
Alles was auf Tastendruecke passiern soll, muss in die Keypressed methode. Diese ueberschreibst du aus dem KeyListener, den du implementierst. Dort gibt es keine Keypressed2 methode, somit wird keypressed2 auch nie aufgerufen, genau wie actionPerformed2
 

Neue Beiträge

Zurück