Hi,
habe gesehen hier sind schon mehrer Postings zu diesem Thema aber leider sind das komplett andere Codes als ich sie haben und selbst wenn ich versuche die Umzuschreiben bekomme ich fehler Meldungen oder es tut sich gar nichts mehr.
Mein Problem ist das wie man aus anderen Posts schon lesen konnte bei dem MosaikSpiel. Ich bekomme mein EventHandler nicht dazu in meinem Frame die Angeklickte karte umzudrehen. Entweder bekomme ich es so hin das die Karte oben links umgedreht wurde oder das ich in dem Frame selber alle angrenzenten Karten. Aber es soll nur die Protokolliert werden die im Applet geklickt wurde.
Ich weiss ist ne menge code. Habe mir überlegt im EventHandler den key der der action methode übergeben wird einer zweiten Tabelle zu übergeben der mir dann die switchSeite aufruft in der MosaikIF klasse. Nur scheiter ich an diesem Versuche. Kann auch sein das ich da Falsch denke. Wäre echt nett wenn mir jemand ein wenig helfen kann dabei.
habe gesehen hier sind schon mehrer Postings zu diesem Thema aber leider sind das komplett andere Codes als ich sie haben und selbst wenn ich versuche die Umzuschreiben bekomme ich fehler Meldungen oder es tut sich gar nichts mehr.
Mein Problem ist das wie man aus anderen Posts schon lesen konnte bei dem MosaikSpiel. Ich bekomme mein EventHandler nicht dazu in meinem Frame die Angeklickte karte umzudrehen. Entweder bekomme ich es so hin das die Karte oben links umgedreht wurde oder das ich in dem Frame selber alle angrenzenten Karten. Aber es soll nur die Protokolliert werden die im Applet geklickt wurde.
Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Panel;
/**
* Die Panel Klasse fügt alle wichtigen
* Komponenten für das MosaikSpiel zusammen.
* und liefert sie dem Applet Container.
*/
public class FarbMosaik extends Panel
{
private ModelIF model;
private MosaikEventHandler eventHandler;
public MosaikEventHandler getEventHandler()
{
return eventHandler;
}
/**
* Implementiert den MosaikModel Konstruktor
* @see MosaikModel#MosaikModel
* Der EventHandler bekommt die MosaikEventHandler
* Objekte zugewiesen.
* @see MosaikEventHandler
* Die Komponenten werden mit einem GridLayout verwaltet.
*/
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++)
{
MosaikCanvas mc = new MosaikCanvas(i, j, farbeRueckseite, farbeVorderseite);
mc.addMouseListener(eventHandler);
model.putObj(i, j, mc);
mc.setSize(canvasBreite, canvasBreite);
this.add(mc);
}
}
}
}
Java:
/**
* Die Interface Klasse stellt die notwendigen
* Methoden für das zusammenfügen der Konponenten
* und die Methode zum drehen der Karten.
*/
public interface ModelIF
{
void action(int zeile, int spalte);
void putObj(int zeile, int spalte, MosaikIF mObj);
}
Java:
import java.awt.Color;
import java.awt.Image;
import java.awt.Component;
import java.awt.*;
import java.applet.Applet;
import java.awt.Frame;
/**
* Das Applet fügt alle Container zu einem fertigen
* Applet zusammen.
* der Farbwert für die Vorder- und Rückseite werden
* gegeben.
* @param farbeRuckseite die Rückseitenfarbe
* @param farbeVorderseite die Vorderseitenfarbe
*/
public class Mosaik extends Applet implements SteuerIF
{
private int raster; //Raster des Spiels
private String bildName; //Name der Bilddatei
private Image image; //Image-Objekt zu "bildName"
private BildMosaik bm; //Panel mit Canvas-Objekten
private FarbMosaik fm;
private VorschauCanvas vorschauBild;
private boolean zuletztBild;
private Color farbeRueckseite;
private Color farbeVorderseite;
private Component steuerPanel;
private MosaikFrame frame;
private StatistikModel statistik;
private String sFrame;
/**
* Díe init-Methode stellt den Parameter für das
* raster bereit das im MosaikCanvas verwendet wird.
*/
public void init()
{
//Parameter einlesen
String temp=getParameter("raster");
try
{
raster = Integer.parseInt(temp);
}
catch(NumberFormatException nfe)
{
raster =4;
System.out.println("Raster auf default=" + raster + " gesetzt." + nfe.toString());
}
bildName = getParameter("bildName");
farbeRueckseite = new Color (230,30,50);
farbeVorderseite = new Color (50,210,30);
image = this.getImage(getCodeBase(), bildName);
//MediaTracking im ImageHandler:
image = ImageHandler.trackImage(image, this);
//zunächst Vorschaubild anzeigen:
vorschauBild = new VorschauCanvas(image);
add(vorschauBild);
steuerPanel = new SteuerPanel(this);
add(steuerPanel);
statistik = new StatistikModel();
/*String sFrame = getParameter("frame");
if (sFrame.equals("on"))
{
ProtokollFrame pf = new ProtokollFrame(raster, getSize().width, farbeRueckseite, farbeVorderseite);
}
*/
}
/**
* Die Methode aus der Interface Klasse SteuerIF
* Es wird geprüft ob mit Bild oder ohne gespielt
* werden soll.
* Fügt dann alle Komponenten zu einem Lauffähigen
* Spiel zusammen.
*/
public void startGame(int raster, boolean modus)
{
if (vorschauBild != null)
{
remove(vorschauBild);
vorschauBild=null;
}
else
{
if(zuletztBild)
{
remove(bm); //BildMosaik-Panel
}
else
{
remove(fm); //FarbMosaik-Panel
}
}
if (modus)
{
frame = new MosaikFrame(raster, image.getWidth(this), farbeRueckseite, farbeVorderseite);
frame.show();
bm = new BildMosaik(raster, farbeRueckseite, image);
add(bm);
bm.getEventHandler().addModel(statistik);
zuletztBild = true;
}
else
{
frame = new MosaikFrame(raster, image.getWidth(this), farbeRueckseite, farbeVorderseite);
frame.show();
fm = new FarbMosaik(raster, image.getWidth(this),farbeRueckseite, farbeVorderseite);
add(fm);
fm.getEventHandler().addModel(statistik);
zuletztBild= false;
}
add(steuerPanel);
validate();
}
public void resetGame()
{
validate();
}
public void destroy()
{
System.out.println(statistik.getStatistikInfo());
}
}
Java:
import java.awt.*;
/**
* Die Komponente simuliert eine Spielkarte mit
* unterschiedlich eingefärbten Vorder - und Rückseiten.
* Meherer Objekte dieser Komponente können zu einem
* Mosaikspiel aggregiert werden.
* Ein Farbwechsel suggeriert das Umdrehen der Karte
*/
public class MosaikCanvas extends Canvas implements MosaikIF
{
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;
}
/**
* Initialisiert ein Objekt unter Angaben der Lage in
* einem Containerraster bei Festlegung von Vorder -
* und Rückseitenfarbe. Der einbettende Container
* soll ein GridLayout verwenden.
* @ param zeile Nummer der <i>Zeile</i> im einbettenden
* Container
* @param spalte Nummer der <i>SPalte</i> im
* einbettenden Container
* @param farbeRueckseite Color-Objekt zur Einfärbung
* der <i>Rückseite</i> der Komoponente
* @param farbeVorderseite Color-Objekt zur Einfärbung
* der <i>Vorderseite</i> der Komponente
*/
public MosaikCanvas(int zeile, int spalte, Color farbeRueckseite, Color farbeVorderseite)
{
this.zeile=zeile;
this.spalte=spalte;
this.farbeRueckseite=farbeRueckseite;
this.farbeVorderseite=farbeVorderseite;
this.setFarbe(farbeRueckseite);
}
/**
* Wechselt die Einfärbung der Komponente, sodass ein
* Umdrehen der Karten suggeriert wird. Gewechselt wird
* zwischen zwei Farben, die im Konstruktor zu setzten
* sind.
* @see #MosaikCanvas
*/
public void switchSeite()
{
vorderseite =!vorderseite;
farbe=(farbe== farbeRueckseite)? farbeVorderseite : farbeRueckseite;
repaint();
}
private Graphics grOffScreen;
private Image imageOffScreen;
public void paint(Graphics g)
{
if (grOffScreen == null)
{
createOffScreenImage();
}
grOffScreen.setColor(getFarbe());
grOffScreen.fillRect(0,0, getSize().width, getSize().height);
//Jetzt Bild auf Komponente zeichen
g.drawImage(imageOffScreen,0,0,this);
}
//Zusätzlich update überschreiben
public void update(Graphics g)
{
paint(g);
}
private void createOffScreenImage()
{
imageOffScreen=createImage(getSize().width, getSize().height);
grOffScreen=imageOffScreen.getGraphics();
}
}
Java:
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Enumeration;
import java.util.Hashtable;
public class MosaikEventHandler implements MouseListener
{
Hashtable modelTable, modelTable1;
Object key;
MosaikFrame mf;
private int zeile, spalte;
public MosaikEventHandler(ModelIF model)
{
modelTable = new Hashtable();
addModel(model);
}
//Die fünf MouseListener Methoden
public void mouseClicked(MouseEvent me)
{}
public void mouseEntered(MouseEvent me)
{}
public void mouseExited(MouseEvent me)
{}
public void mousePressed(MouseEvent me)
{}
/**
* Implementierung der MouseListener zwecks wechsel der
* Seite einer eingebettenen MosaikCanvas-Komponente.
* Das Event-auslösende MosaikCanvas-Objekt wird
* ermittelt und dessen switchSeite-Methode aufgerufen.
* @see MosaikCanvas#switchSeite
* Der action-Methode von ModelIF wird der Key
* übergeben und das umdrehen der Karten wird
* ermöglicht.
* @see ModelIF
*/
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);
}
}
/**
* Implementiert ein neues model unter
* angabe der Schlüssel die zuvor in der
* Hashtabel erzeugt wurden.
*/
public void addModel(ModelIF model)
{
key = new Integer(model.hashCode());
modelTable.put(key, model);
}
public ModelIF removeModel(ModelIF model)
{
key = new Integer(model.hashCode());
return (ModelIF)modelTable.remove(key);
}
}
Java:
import java.awt.Frame;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.util.*;
public class MosaikFrame extends Frame
{
private ModelIF mf;
private MosaikEventHandler eventHandler;
private MosaikIF fm;
private int zeile, spalte;
private MosaikModel mosaikModel;
public MosaikFrame(int raster, int breite, Color farbeRueckseite, Color farbeVorderseite)
{
setTitle("Protokollfenster");
setSize(437,470);
setLocation(440, 0);
mf = new MosaikModel(raster, raster);
//eventHandler = new MosaikEventHandler(mf);
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++)
{
MosaikCanvas mc = new MosaikCanvas(i,j, farbeRueckseite, farbeVorderseite);
mf.putObj(i,j, mc);
mc.setSize(canvasBreite, canvasBreite);
add(mc);
}
}
}
}
Java:
/**
* Die Interface Klasse stellt die Methoden
* für die Zeilen anzahl sowie Spalten zahl
* zur verfügung, die Methode zum Suggerieren
* des Kartenwechsel und die abfrage welche
* Seite oben ist.
*/
public interface MosaikIF
{
boolean isVorderseite();
int getZeile();
int getSpalte();
void switchSeite();
}
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];
}
/**
* Das Umdrehen der Nachbarkarten wird durch eine if
* Abfrage geprüft. Befindet sich neben der angeklickten
* karte weitere Karten so werden diese gedreht.
*/
public void switchNachbarn(int zeile, int spalte)
{
//erste Zeile: 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);
}
//zweite Zeile: links, rechts
if (spalte-1 >=0)
{
invert(zeile, spalte-1);
}
if (spalte+1 < spalten)
{
invert (zeile, spalte+1);
}
// dritte Zeile: Mitte, Links,Rechts
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);
}
}
/**
* Sorgt für das umdrehen der karten indem die
* switchSeite-Methode aufgerufen wird.
* @see MosaikCanvas#switchSeite
*/
private void invert(int zeile, int spalte)
{
mObjects[zeile][spalte].switchSeite();
}
/**
* der Konstruktor fügt die Objekte in den Container
* MosaikCanvas ein.
* @see MosaikIF
*/
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:
/**
* Die Interface Klasse stellt die beiden
* Methoden zum Starten und Neustarten des
* Mosaikspiels zur Verfügung.
*/
public interface SteuerIF
{
void startGame(int raster, boolean modus);
void resetGame();
}
Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Die Komponente dieser Klasse stellen die Steuerkonsole
* bereit. Zum Starten des Spiels, der Rastereinstellung
* und einen Button zum Neustarten.
*/
public class SteuerPanel extends Panel implements ActionListener
{
//Die GUI-Elemente
Label labRaster; //welches Raster (Breite wie Höhe)
TextField tfRaster;
Checkbox checkBild; //mit (true) oder ohen Bild spielen
Button bStart; //Spiel mit den Einstellungen starten
Button bReset; //Umschalten auf Startansicht
private int raster; //Raster des Spiels
private boolean mitBild; //Bild- /Farbvariante
private SteuerIF container; //Wird vom Applet implementiert
private MosaikFrame frame;
/**
* Stellt das Aussehen der Steuerkonsole zusammen
* mit Schriftart, und Layout
* Den Buttons wird ein Text und der ActionListener
* übergeben.
*/
public SteuerPanel(SteuerIF container)
{
this.container=container;
setLayout(new FlowLayout());
setFont(new Font("Dialog", Font.BOLD,12));
labRaster = new Label("Felder je Zeile und Spalte:", Label.CENTER);
raster=5; //Default Einstellung
tfRaster = new TextField(Integer.toString(raster));
checkBild= new Checkbox("Mit Bild spielen?", true);
bStart = new Button(" Start ");
bStart.addActionListener(this);
bReset = new Button(" Reset ");
bReset.addActionListener(this);
startKonfiguration();
}
/**
* Initialisiert die Objekte für die Start- Konfiguration
* die zuvor erstellt wurden
* @see SteuerPanel#SteuerPanel
*/
public void startKonfiguration()
{
remove(bReset);
add(labRaster);
add(tfRaster);
add(checkBild);
add(bStart);
//Verwendung des gespeicherten raster-Wertes
tfRaster.setText(Integer.toString(raster));
//java.awt.TextComponent-Methode:
tfRaster.selectAll();
//java.awt.Component-Methode
tfRaster.requestFocus();
}
/**
* Die Reset-Konfiguration für das laufende Spiel
* @see SteuerPanel#SteuerPanel
*/
public void resetKonfiguration()
{
remove(labRaster);
remove(tfRaster);
remove(checkBild);
remove(bStart);
add(bReset);
}
/**
* Das ActionEvent sorgt dafür das beim Mausklick
* auf den Button das spiel gestartet bzw.
* neu geladen wird.
* Die Start und Reset funktion wurden in die
* SteuerIF klasse ausgelagert
* @see SteuerIF
*/
public void actionPerformed (ActionEvent ae)
{
if (ae.getSource()==bStart)
{
try
{
//Speicherung des raster-Wertes
raster=Integer.parseInt(tfRaster.getText().trim());
}
catch(NumberFormatException nfe)
{
raster=5; //default wert
}
mitBild=checkBild.getState();
resetKonfiguration();
container.startGame(raster, mitBild);
}
if (ae.getSource()==bReset)
{
startKonfiguration();
container.resetGame();
}
}
}
Ich weiss ist ne menge code. Habe mir überlegt im EventHandler den key der der action methode übergeben wird einer zweiten Tabelle zu übergeben der mir dann die switchSeite aufruft in der MosaikIF klasse. Nur scheiter ich an diesem Versuche. Kann auch sein das ich da Falsch denke. Wäre echt nett wenn mir jemand ein wenig helfen kann dabei.