Farben-Spiel

Dogge

Aktives Mitglied
:applaus:

Toll dass DU vorbeischaust.


mosaik.jpg


Ja, so sollte mein Spiel aussehen.

Das Model dazu ist zunächst:
Java:
public class MosaikModel implements ModelIF {
	private MosaikIF [] [] mObjects;
	private int zeilen, spalten;
	
	public MosaikModel(int zeilen, int spalten) {
		this.zeilen=zeilen;
		this.spalten=spalten;
		mObjects = new MosaikIF[zeilen][spalten]; 
		/*MosaikIF statt MosaikCanvas2*/
		
	}
	public void switchNachbarn(int zeile, int spalte) {
		//Mitte ,Links ,Rechts
		if(zeile-1>=0) {
			invert(zeile-1,spalte);
			if(spalte-1>=0) {
				invert(zeile-1,spalte-1);
			}
			if(spalte+1<spalten) {
				invert(zeile-1,spalte+1);
			}
		}
		if(spalte-1>=0) {
			invert(zeile,spalte-1);
		}
		if(spalte+1<spalten) {
			invert(zeile,spalte+1);
		}
		if(zeile+1<zeilen) {
			invert(zeile+1,spalte);
			if(spalte-1>=0) {
				invert(zeile+1,spalte-1);
				
			
			}
			if(spalte+1<spalten) {
				invert(zeile+1,spalte+1);
			}
		}
	}
	private void invert(int zeile,int spalte) {
		mObjects [zeile][spalte].switchSeite();
			
	}
	
	public void putObj (int zeile,int spalte ,MosaikIF mObj) {
		mObjects [zeile][spalte ]= mObj;
	}
	public void action(int zeile, int spalte) {
		this.switchNachbarn(zeile,spalte);
		
	}
	

}
[/Java]
Wie DU erkennen kannst steuert MosaikModel welche Kästchen gefärbt werden.(switchNachbarn.)
Sämtliche Kästchen werden in einem MosaikIF Array abgelegt.
MosaikIF:
[code=Java]
public interface MosaikIF {
	boolean isVorderseite();
	int getZeile();
	int getSpalte();
	void switchSeite();
	
	

}

MosaikModel hat aber auch switch() benötigt, welche sich in MosaikCanvas befindet.
Dort wird auch MosaikIF implementiert.
Also MosaikCanvas:
Java:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;


public class MosaikCanvas3 extends Canvas implements MosaikIF {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Color farbe, farbeRueckseite, farbeVorderseite;
	public Color getFarbe() {
		return farbe;
	}
	public void setFarbe(Color inValue) {
		farbe=inValue;
	}
	private boolean vorderseite = false;
	public boolean isVorderseite() {
		return vorderseite;
	}
	private int zeile, spalte;
	public int getZeile() {
		return zeile;
	}
	public int getSpalte() {
		return spalte;
	}
	public MosaikCanvas3(int zeile,int spalte, Color farbeRueckseite, Color farbeVorderseite) {
		this.zeile=zeile;
		this.spalte=spalte;
		this.farbeRueckseite=farbeRueckseite;
		this.farbeVorderseite=farbeVorderseite;
		this.setFarbe(farbeRueckseite);
		
	}
	public void switchSeite() {
		vorderseite=!vorderseite;
		farbe=(farbe==farbeRueckseite)? farbeVorderseite : farbeRueckseite;
		repaint();
	}
	
	public void paint(Graphics g) {
		g.setColor(getFarbe());
		g.fillRect(0, 0, this.getSize().width-1 ,this.getSize().height-1 );
	}
	
	
	


}

Also hier in MosaikCanvas geht es um die graphische Umsetzung.

Um meine Mausklicks registrieren zu können habe ich eine Controller-Klasse geschrieben:
MosaikEventHandler:
Java:
import java.awt.event.MouseEvent;
import java.util.Enumeration;
import java.util.Hashtable;


public class MosaikEventHandler {
	Hashtable modelTable;
	
	Object key;
	

	
	
	public MosaikEventHandler(ModelIF model) {
		modelTable = new Hashtable();
		addModel(model);
		
		
	}
	
	public void addModel(ModelIF model) {
		key=new Integer(model.hashCode());
		modelTable.put(key, model);// TODO Auto-generated method stub
		
	}
	
	public ModelIF removeModel(ModelIF model) {
		key=new Integer(model.hashCode() );
		return (ModelIF)modelTable.remove(key);
	}

	private int zeile, spalte;
	/* MosaikIF statt MosaikCansas2*/
	public void mouseReleased(MouseEvent me) {
		zeile=((MosaikIF)me.getSource()).getZeile();
		spalte=((MosaikIF)me.getSource()).getSpalte();
		 
		Enumeration enum = modelTable.keys();
		while(enum.hasMoreElements()) {
			key=enum.nextElement();
			((ModelIF)modelTable.get(key)).action(zeile, spalte);
		}
	}

	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

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



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

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

}
Bei mosaikEventHandler hab ich versucht alle Kästchen auf einer Hashtable zu speichern und zwar mit ModelIF-Objekten. Der Zugriff auf die Kästchen wird über action() gemach welch in der ModelIF steckt. Diese ist auch im MosaikModel implementiert.



Bis HIER gabs KEINE PROBLEME!

:autsch:
Jetzt kommts:

FarbMosaik ist das Problem:
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;

import java.awt.event.MouseListener;




public class FarbMosaik {
	
	
	private ModelIF model;
	
	private MosaikEventHandler eventHandler;
	
	
	
	
	
	public FarbMosaik(int  raster, int breite, Color farbeRueckseite, Color farbeVorderseite) {
		
		model= new MosaikModel(raster,raster);
		eventHandler=new MosaikEventHandler(model);
		this.setLayout(new GridLayout(raster,raster,1,1));
		int canvasBreite=breite/raster;
		
		for(int i=0;i<raster;i++) {
			for (int j=0;j<raster;j++) {
				MosaikCanvas3 mc3 = new MosaikCanvas3(i,j,farbeRueckseite,farbeVorderseite);
				mc3.addMouseListener((eventHandler) ) ;
				model.putObj(i, j, mc3);
				mc3.setSize(canvasBreite,canvasBreite);
				this.add(mc3);
				
				
			}
			
			
		}
		
	}










}


Fehlermeldung:C:\eclipse_workspace\MoSp3>javac FarbMosaik.java
FarbMosaik.java:23: cannot resolve symbol
symbol : method setLayout (java.awt.GridLayout)
location: class FarbMosaik
this.setLayout(new GridLayout(raster,raster,1,1));
^
FarbMosaik.java:29: addMouseListener(java.awt.event.MouseListener) in java.awt.C
omponent cannot be applied to (MosaikEventHandler)
mc.addMouseListener(eventHandler) ;
^
FarbMosaik.java:30: cannot resolve symbol
symbol : variable mosaikModel
location: class FarbMosaik
mosaikModel.putObj(i, j, mc);
^
FarbMosaik.java:32: cannot resolve symbol
symbol : method add (MosaikCanvas3)
location: class FarbMosaik
this.add(mc);
^
4 errors
:noe:
 
Zuletzt bearbeitet:
Also der erste Fehler ist ziemlich einfach: Mosaik ist kein
Code:
Canvas/Applet
oder sonstwas, weswegen es natürlich auch keine
Code:
setLayout()
- bzw add()-Methode kennt.

[EDIT]Wenn du schon Fehlermeldungen mit Zeilennummern schreibst, dann aber auch bitte mit den tatsächlichen, sonst sucht man sich ja ´nen Wolf nach Zeile 23[/EDIT]

Zu Fehler 3 kann man nich viel sagen, eine Variable
Code:
mosaikModel
seh ich in deinem Code nicht, nur
Code:
model
. Wahrscheinlich hast du diesen Fehler bereits elimiert.
 
Zuletzt bearbeitet:
würde ich auch vermuten. In Zeile 26 bzw 35 benutzt du Methoden, die deine Klasse einfach nicht hat. setLayout() / add().

EDIT:
putObj() ist im überigen eine Methode deine MosaikModel Klasse. Das ist im diesem Fall aber lediglich der Laufzeittyp. Du arbeitest ja mit deinem Interface ModelIF. Das wiederum stellt nur vier Methoden zur Vefügung: boolean isVorderseite(); int getZeile(); int getSpalte(); void switchSeite();

Also entweder die putObj() Methode mit in Interface aufnehmen oder in Zeile 32 casten:
((MosaikModel)model).putObj(i, j, mc3)
 
Zuletzt bearbeitet:
OHNE komplizierte Hashtable geht es!
Java:
import java.awt.Color;
import java.awt.Panel;
import java.awt.GridLayout;
import java.awt.event.MouseListener;



public class FarbMosaik extends Panel  {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private MosaikModel mosaikModel;
	private MosaikEventHandler eventHandler;
	
	
	
	
	public FarbMosaik(int  raster, int breite, Color farbeRueckseite, Color farbeVorderseite) {
		
		mosaikModel= new MosaikModel(raster,raster);
		eventHandler=new MosaikEventHandler(mosaikModel);
		this.setLayout(new GridLayout(raster,raster,1,1));
		int canvasBreite=breite/raster;
		
		for(int i=0;i<raster;i++) {
			for (int j=0;j<raster;j++) {
				MosaikCanvas2 mc = new MosaikCanvas2(i,j,farbeRueckseite,farbeVorderseite);
				mc.addMouseListener(eventHandler);
				mosaikModel.putObj(i, j, mc);
				mc.setSize(canvasBreite,canvasBreite);
				this.add(mc);
				
				
			}
			
			
		}
		
	}

}


Wo liegt der unterschied bei den verwendeten Methoden? Ich glaub das ist komplizierter.
 
[EDIT]Wenn du schon Fehlermeldungen mit Zeilennummern schreibst, dann aber auch bitte mit den tatsächlichen, sonst sucht man sich ja ´nen Wolf nach Zeile 23[/EDIT]
Sorry



Zu Fehler 3 kann man nich viel sagen, eine Variable
Code:
mosaikModel
seh ich in deinem Code nicht, nur
Code:
model
. Wahrscheinlich hast du diesen Fehler bereits elimiert.

Ja stimmt mosaikModel gibt es nicht mehr(in keiner Klasse oder Interface). Das war noch ohne Hashtable.
[EDIT]
C:\eclipse_workspace\MoSp3>javac FarbMosaik.java
FarbMosaik.java:25: cannot resolve symbol
symbol : method setLayout (java.awt.GridLayout)
location: class FarbMosaik
this.setLayout(new GridLayout(raster,raster,1,1));
^
FarbMosaik.java:31: addMouseListener(java.awt.event.MouseListener) in java.awt.
omponent cannot be applied to (MosaikEventHandler)
mc3.addMouseListener((eventHandler) ) ;
^
FarbMosaik.java:34: cannot resolve symbol
symbol : method add (MosaikCanvas3)
location: class FarbMosaik
this.add(mc3);
^
3 errors
[/EDIT]
 
Zuletzt bearbeitet:
die vielen Ausrufezeichen im Titel, vorne wie auch hinten, sind absolut danebene Aufmerksamkeits-Hascherei,
falls ich es schaffen sollte, das bei dir zu merken und das öfters auftritt, kann zumindest mal ein geschlossenes Thema für sowas herausspringen
 
Wo liegt der unterschied bei den verwendeten Methoden?
Wüsste ich auch gerne. Ich sehe absolut null Unterschied zwischen dem, was du am Anfang geschrieben hast und der Klasse von 12:51. Was du mit der HashTable meinst, ist auch unklar, sehe ich nirgends...
[EDIT]Danke für den Hinweis X5-599, hab´s gefunden, womit sich mein Beitrag erledigt hat.[/EDIT]
Ich blick nicht durch... Sorry.
Ich auch nicht mehr...
 
Zuletzt bearbeitet:
Na ein Unterschied ist das er jetzt
Java:
private MosaikModel mosaikModel;
das stehen hat. Vorher war es:
Java:
private ModelIF mosaikModel;

Also funktioniert jetzt auch das putObj().


EDIT: Moment mal. Ich komm gerade ganz durcheinander. Gibt es eigentlich zwei Interfaces? ModelIF und MosaikIF? Ich blick nicht durch... Sorry.
 
Zuletzt bearbeitet:
Wüsste ich auch gerne. Ich sehe absolut null Unterschied zwischen dem, was du am Anfang geschreieben hast und der Klasse von 12:51. Was du mit der HashTable meinst, ist auch unklar, sehe ich nirgends...
[EDIT]Danke für den Hinweis X5-599, hab´s gefunden, womit sich mein Beitrag erledigt hat.[/EDIT]

Ich auch nicht mehr...
Das hier meine ich:
Java:
import java.awt.event.MouseEvent;
import java.util.Enumeration;
import java.util.Hashtable;


public class MosaikEventHandler {
	Hashtable modelTable;
	
	Object key;
	

	
	
	public MosaikEventHandler(ModelIF model) {
		modelTable = new Hashtable();
		addModel(model);
		
		
	}
	
	public void addModel(ModelIF model) {
		key=new Integer(model.hashCode());
		modelTable.put(key, model);// TODO Auto-generated method stub
		
	}
	
	public ModelIF removeModel(ModelIF model) {
		key=new Integer(model.hashCode() );
		return (ModelIF)modelTable.remove(key);
	}

	private int zeile, spalte;
	/* MosaikIF statt MosaikCansas2*/
	public void mouseReleased(MouseEvent me) {
		zeile=((MosaikIF)me.getSource()).getZeile();
		spalte=((MosaikIF)me.getSource()).getSpalte();
		 
		Enumeration enum = modelTable.keys();
		while(enum.hasMoreElements()) {
			key=enum.nextElement();
			((ModelIF)modelTable.get(key)).action(zeile, spalte);
		}
	}

	public void mouseClicked(MouseEvent me) {
		// TODO Auto-generated method stub
		
	}

	public void mousePressed(MouseEvent me) {
		// TODO Auto-generated method stub
		
	}



	public void mouseEntered(MouseEvent me) {
		// TODO Auto-generated method stub
		
	}

	public void mouseExited(MouseEvent me) {
		// TODO Auto-generated method stub
		
	}
	

}


MosaikModel möchte ich ja nicht mehr verwenden, bzw. nirgends direkt. Alles soll mit Hilfe von MosaikIF bzw. ModelIF laufen.
 
Zuletzt bearbeitet:
MosaikModel möchte ich ja nicht mehr verwenden, bzw. nirgends direkt. Alles soll mit Hilfe von MosaikIF bzw. ModelIF laufen.
Dann leg ich dir nochmals den Edit von X5-599 um 12:40 ans Herz, da steht genau drin, was du ändern musst, damit´s auch mit dem Interface klappt.
 
@HimBromBeere
Ich bin mir nichtmehr sicher, ob das daran liegt. Was mir aber aufgefallen ist:

Hier implementierst du zwar die Methoden eines MouseListeners, aber du sagst deiner Klasse nicht das sie einer ist.
Java:
public class MosaikEventHandler implements MouseListener
 
@HimBromBeere
Ich bin mir nichtmehr sicher, ob das daran liegt. Was mir aber aufgefallen ist:

Hier implementierst du zwar die Methoden eines MouseListeners, aber du sagst deiner Klasse nicht das sie einer ist.
Java:
public class MosaikEventHandler implements MouseListener
Danke, da muss ich was weg gemacht haben.Compiliert wurde die Klasse mit MouseListener.
[EDIT]Ändern tut das aber nichts. FarbMosaik scheint die Objekte in der Map nicht zu verstehen und kann entsprechend mit den methoden die diese Objekte verwenden nichts anfangen.
Aber da blick ich nicht durch. Ich würde das übersichtlicher gestalten, aber wie?[/EDIT]
[EDIT]Wie kann ich eine Programmstruktur hochladen oder ein Bild?[/EDIT]
[EDIT]
X5-599 Dein Beitrag bzgl. putObj hat funktioniert.
Jetzt streikt noch die add-methode und das setLayout.


[/EDIT]
 
Zuletzt bearbeitet:
Das mit dem add() und setLayout() lag wie gesagt daran, das du am Anfang nicht von Panel geerbt hast. Im Beispiel von 12:51 müsste das aber funktioniert haben...
 
Das mit dem add() und setLayout() lag wie gesagt daran, das du am Anfang nicht von Panel geerbt hast. Im Beispiel von 12:51 müsste das aber funktioniert haben...
Sorry hat leider beim Abspeichern erneut compiliert und den Fehler wieder angezeigt. War zu schön um wahr zu sein. 😳Von Panel habe ich immer geerbt.😳

[EDIT]Stimmt hab vergessen von Panel zu erben, DANKE[/EDIT]

[EDIT]
Dieser eine Fehler ist geblieben:

C:\eclipse_workspace\MoSp3>javac FarbMosaik.java
FarbMosaik.java:32: addMouseListener(java.awt.event.MouseListener) in java.awt.
omponent cannot be applied to (MosaikEventHandler)
mc3.addMouseListener((eventHandler) ) ;
^
1 error
[/EDIT]
 
Zuletzt bearbeitet:
Wie? Mit demselben Fehler? Das er die add() Methoden nicht findet? Sehr seltsam.
Ach ja, Bilder kann man z.B. unter "Zusätzliche Einstellungen" anhängen. Einfach unter "Dateien anhängen" auf "Anhänge verwalten" klicken...
 
würde ich auch vermuten. In Zeile 26 bzw 35 benutzt du Methoden, die deine Klasse einfach nicht hat. setLayout() / add().




Also entweder die putObj() Methode mit in Interface aufnehmen oder in Zeile 32 casten:
((MosaikModel)model).putObj(i, j, mc3)

putObj() ist in ModelIF drin mit der action()-Methode.


Der Castingvorschlag hat nichts gebracht.Nur am Anfang,dann ist der Fehler wieder angezeigt worden.
[EDIT]


public interface ModelIF {

void action(int zeile, int spalte);
void putObj(int zeile, int spalte, MosaikIF mObj);

}
[/EDIT]

[EDIT]
C:\eclipse_workspace\MoSp3>javac FarbMosaik.java
FarbMosaik.java:32: addMouseListener(java.awt.event.MouseListener) in java.awt.
omponent cannot be applied to (MosaikEventHandler)
mc3.addMouseListener((eventHandler) ) ;
^
1 error
[/EDIT]
 
Zuletzt bearbeitet:
Code:
C:\eclipse_workspace\MoSp3>javac FarbMosaik.java
 FarbMosaik.java:32: addMouseListener(java.awt.event.MouseListener) in java.awt.
 omponent cannot be applied to (MosaikEventHandler)
 mc3.addMouseListener((eventHandler) ) ;
 ^
 1 error
Klingt mir danach, als würde dein Handler entgegen deiner Behauptung nicht das Interface
Code:
MouseListener
implementieren. Steht da wirklich
Java:
class MosaikEventHandler implements MouseListener
?

[EDIT]So langsam verlier ich hier aber sowieso den Überblich, was du nun schon geändert hast und was nicht. Kompilier das Programm nochmal und schick nochmal alle Quellen, die du am Anfang geschrieben hast (SOFERN MÖGLICH ABER IN ´NER KURZFASSUNG, also z.B. nur mit Funktionsdeklarationen usw.)[/EDIT]
 
Zuletzt bearbeitet:
FERTIG Ich musste noch das MouseListener InterFace in MosaikCancas implementieren.:lol::lol::lol::lol::toll::toll::toll::toll::toll::applaus::applaus::applaus::applaus:🙂🙂😉


Dank an ALLE die mir geholfen haben.😀
 
die vielen Ausrufezeichen im Titel, vorne wie auch hinten, sind absolut danebene Aufmerksamkeits-Hascherei,
falls ich es schaffen sollte, das bei dir zu merken und das öfters auftritt, kann zumindest mal ein geschlossenes Thema für sowas herausspringen
Ich werde mich in Zukunft humaner verhalten und ! oder Ähnliches weglassen.🙂
 

Zurück
Oben