Componenten überlappen sich

Leroux

Erfahrenes Mitglied
Hi ich hab folgendes Problem ich hab ein JPanel auf dem lass ich Kreise zeichen:

Spielfeld:
Java:
public class Spielfeld extends JPanel {
	static {
		try {
			javax.swing.UIManager.setLookAndFeel("com.jgoodies.looks.plastic.PlasticXPLookAndFeel");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	MouseListener mm = new MouseListener(){

		@Override
		public void mouseClicked(MouseEvent e) {
				Stein tmp1 = (Stein)e.getComponent();
				System.out.println(tmp1);
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
	};
	
	HashMap<Integer, SteinUI> vcomp = new HashMap<Integer, SteinUI>();
	public Spielfeld() {
		this.setBackground(Color.BLACK);
		this.setLayout(null);
		erstelleFeld();
	}
	
	void erstelleFeld(){
		int zahl1 = 1;
		for(int i=0;i<7;i++){
			for(int k=0;k<7;k++){
				Stein tmp = null;
				int zahl = (int) (Math.random() * 4 + 1);
				switch(zahl){
				case 1:tmp = new Rot();break;
				case 2:tmp = new Blau();break;
				case 3:tmp = new Gelb();break;
				case 4:tmp = new Weiss();break;
				}
				vcomp.put(zahl1,(new SteinUI(tmp,i,k)));
				zahl1++;
			}
		}
		
		for(Integer res : vcomp.keySet()){
			vcomp.get(res).comp.addMouseListener(mm);
			vcomp.get(res).comp.setStein(vcomp.get(res).posx, vcomp.get(res).posy);
			vcomp.get(res).comp.setSteinID(res);
			this.add(vcomp.get(res).comp);
		}
		System.out.println("===");
		for(Component res: this.getComponents()){
			System.out.println(res);
		}
	}
}

So und eine Oberklasse Steine:
Java:
public class Stein extends JComponent{
	
	int posX,posY;
	final static int nextPos = 80;
	int steinID;
	public Stein()
	{
		this.setBounds(0,0,800,800); // <= Vllt in Fehler
	}
	
	public void setSteinID(int steinId){
		steinID = steinId;
	}
	public int getSteinID(){
		return steinID;
	}
	public void setPosition(int posx,int posy)
	{
		this.posX = posx;
		this.posY = posy;
	}
	public void setStein(int posx,int posy)
	{
		if(posX<7 || posY < 7){
		this.posX = nextPos * posx;
		this.posY = nextPos * posy;
		}else{
			System.out.println("Falsche Position");
		}
	}
	
	public Point getPosition()
	{
		return new Point(posX,posY);
	}
	
}

Von dem leite ich dann die Farbigen steine ab zb Rot:

Java:
public class Rot extends Stein{
 	public void paint(Graphics g) 
 	{
 		g.setColor(Color.RED);
 		g.fillOval(posX, posY, 70, 70);
 		g.setColor(Color.BLACK);
 		super.paint(g);
 	}
}

Java:
package beta;

import javax.swing.JComponent;

import beta.steine.Stein;

public class SteinUI {
	public Stein comp;
	public int posy, posx;
	public SteinUI(Stein comp, int posx,int posy){
		this.comp = comp;
		this.posx =  posx;
		this.posy = posy;
	}
}

Es sind alle klassen vorhanden um es laufen zu lassen... bis auf Blau, Geld, Weiss.

Da ich aber im Spielfeld einen Mouselistener drin habe möchte ich wissen welche Stein ich angeklickt habe(Steine haben eine ID).
Doch leider legt dich der erste Stein über alle andern !
Dies liegt vermutlich am setBounds im Konstruktor der Steinklasse den ich auf Fensterbreite gestellt habe(800,800).
Wenn ich ihn kleiner mache z.b so groß wie ein Stein Wirklich ist wird der Stein nur in dem Rahmen gezeichenet.
Kann mir jemand helfen ?

mfg
 
Zuletzt bearbeitet:
Zurück