Unten stehender Code erstellt ein Spielfeld mit z.B. 5x5 Karten; wird eine Karte angeklickt, so werden alle angrenzenden Karten umgedreht, d.h. sie verändern die Farbe, die angeklickte Karte verändert die Farbe nicht.
Nun soll ein Protokollfenster mit identischer Spielfläche erstellt werden. Wird auf eine Karte im Spielfeld (Applet) geklickt, so werden im Applet die angrenzenden Karten wie oben beschrieben umgedreht. Im Protokollfenster soll hingegen die angeklickten Karten des Applets "aufgezeichnet" werden, d.h. die entsprechende Karte im Protokollfenster soll die Farbe verändern.
Das Applet funktioniert, auch konnte ich das Protokollfenster mit der Spielfläche erzeugen.
Lt. Aufgabenstellung besteht die Lösung aus flexiblem EventHandling und Interfaces.
----------------------------------------------------------------------------------------------------------------------------------
Wenn ich jetzt ein Feld im Applet anklicke, so minimiert sich das Protokollfenster. Gibt es eine Möglichkeit, dass das Applet und das Protokollfenster offen bleibt?
Wie kann ich die Karte im Protokollfenster zum "Umdrehen" bringen, wenn ein Klick auf ein Feld im Applet erfolgt?
Benötige ich eine zusätzliche MosaikCanvas-Klasse für die Felder im Protokollfenster, oder kann ich die bestehende MosaikCanvas-Klasse inkl. MosaikIF-Interface dafür verwenden?
Wo muss das Umdrehen der Karten im Protokollfenster angesteuert werden? Im MosaikEventHandler? Muss hierfür dann die MosaikModel-Klasse erweitert werden?
Danke für die Hilfe.
Walli
-------------------------------------------------------------------------------------------------------------------------------------
Roar: Codetags
Nun soll ein Protokollfenster mit identischer Spielfläche erstellt werden. Wird auf eine Karte im Spielfeld (Applet) geklickt, so werden im Applet die angrenzenden Karten wie oben beschrieben umgedreht. Im Protokollfenster soll hingegen die angeklickten Karten des Applets "aufgezeichnet" werden, d.h. die entsprechende Karte im Protokollfenster soll die Farbe verändern.
Das Applet funktioniert, auch konnte ich das Protokollfenster mit der Spielfläche erzeugen.
Lt. Aufgabenstellung besteht die Lösung aus flexiblem EventHandling und Interfaces.
----------------------------------------------------------------------------------------------------------------------------------
Wenn ich jetzt ein Feld im Applet anklicke, so minimiert sich das Protokollfenster. Gibt es eine Möglichkeit, dass das Applet und das Protokollfenster offen bleibt?
Wie kann ich die Karte im Protokollfenster zum "Umdrehen" bringen, wenn ein Klick auf ein Feld im Applet erfolgt?
Benötige ich eine zusätzliche MosaikCanvas-Klasse für die Felder im Protokollfenster, oder kann ich die bestehende MosaikCanvas-Klasse inkl. MosaikIF-Interface dafür verwenden?
Wo muss das Umdrehen der Karten im Protokollfenster angesteuert werden? Im MosaikEventHandler? Muss hierfür dann die MosaikModel-Klasse erweitert werden?
Danke für die Hilfe.
Walli
-------------------------------------------------------------------------------------------------------------------------------------
Code:
import java.awt.Color;
import java.applet.Applet;
public class Mosaik extends Applet
{
private Color farbeRueck, farbeVor;
private int raster; //Rastermaß der Spielfläche
public void init()
{
resize(250,280);
//Spielparameter
String temp=getParameter("raster");
raster=Integer.parseInt(temp);
farbeRueck=new Color(230,30,50);
farbeVor=new Color(50,210,30);
//Spielfläche
FarbMosaik fm=new FarbMosaik(raster,getSize().width,farbeRueck,farbeVor);
add(fm);
}
}
import java.awt.Panel;
import java.awt.Color;
import java.awt.GridLayout;
public class FarbMosaik extends Panel
{
protected ModelIF mm;
protected MosaikEventHandler eventHandler;
public FarbMosaik(int raster, int breite, Color farbeRueck, Color farbeVor)
{
mm=new MosaikModel(raster,raster);
eventHandler=new MosaikEventHandler(mm);
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,farbeRueck,farbeVor);
mc.addMouseListener(eventHandler);
mm.putMObj(i,j,mc);
mc.setSize(canvasBreite, canvasBreite);
add(mc);
}
}
}
}
import java.awt.*;
public class MosaikCanvas extends Canvas implements MosaikIF
{
private Color farbe, farbeRueck, farbeVor;
public Color getFarbe() {return farbe;}
public void setFarbe(Color inValue) {farbe=inValue;}
private boolean seite;
public boolean getSeite() {return seite;}
public void setSeite(boolean inValue) {seite=inValue;}
private int zeile, spalte;
public int getZeile() {return zeile;}
public void setZeile(int inValue) {zeile=inValue;}
public int getSpalte() {return spalte;}
public void setSpalte(int inValue) {spalte=inValue;}
public MosaikCanvas(int zeile, int spalte, Color farbeRueck, Color farbeVor)
{
this.zeile=zeile;
this.spalte=spalte;
this.farbeRueck=farbeRueck;
this.farbeVor=farbeVor;
setSeite(false); //default-Wert
setFarbe(farbeRueck); //default-Wert
}
public void switchSeite()
{
seite=!seite;
farbe=(farbe == farbeRueck) ? farbeVor : farbeRueck;
repaint();
}
public void paint(Graphics g)
{
g.setColor(getFarbe());
g.fillRect(0,0,getSize().width-1,getSize().height-1);
}
}
public interface MosaikIF
{
public boolean getSeite();
public void switchSeite();
public int getZeile();
public int getSpalte();
}
public class MosaikModel implements ModelIF
{
MosaikIF [] [] mObjects;
int zeilen, spalten;
public MosaikModel(int zeilen, int spalten)
{
this.zeilen=zeilen;
this.spalten=spalten;
mObjects=new MosaikIF[zeilen] [spalten];
}
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);
}
}
public void invert(int zeile, int spalte)
{
getMObj (zeile,spalte).switchSeite();
}
public void putMObj(int zeile, int spalte, MosaikIF mObj)
{
mObjects [zeile] [spalte]=mObj;
}
public MosaikIF getMObj(int zeile, int spalte)
{
return mObjects [zeile] [spalte];
}
public void action(int zeile, int spalte)
{
switchNachbarn(zeile,spalte);
}
}
public interface MosaikIF
{
public boolean getSeite();
public void switchSeite();
public int getZeile();
public int getSpalte();
}
import java.awt.event.*;
import java.util.Hashtable;
import java.util.Enumeration;
public class MosaikEventHandler implements MouseListener
{
private int zeile, spalte;
ModelIF mm;
Hashtable modelTable;
Object key;
public MosaikEventHandler(ModelIF mm)
{
modelTable=new Hashtable();
key=new Integer(mm.hashCode());
modelTable.put(key,mm);
}
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);
}
public void mouseClicked(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
public void mousePressed(MouseEvent me) {}
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); //löst Umdrehen der angrenzenden Karten im Applet aus
}
}
}
//Änderung von Mosaik und Hinzufügen der FrameMosaik-Klasse für das Erzeugen des Protokollfensters mit
//Spielfeld im Protokollfenster
import java.awt.Color;
import java.applet.Applet;
import java.awt.Frame;
public class Mosaik extends Applet
{
private Color farbeRueck, farbeVor;
private int raster; //Rastermaß der Spielfläche
public void init()
{
Frame frame = new Frame();
frame.setTitle("Protokollfenster");
frame.setSize(255, 285);
frame.setLocation(400, 150);
frame.setVisible(true);
frame.show();
resize(250,280);
//Spielparameter
String temp=getParameter("raster");
raster=Integer.parseInt(temp);
farbeRueck=new Color(230,30,50);
farbeVor=new Color(50,210,30);
//Spielfläche
FarbMosaik fm=new FarbMosaik(raster,getSize().width,farbeRueck,farbeVor);
FrameMosaik fm1=new FrameMosaik(raster,getSize().width,farbeRueck,farbeVor);
frame.add(fm1);
frame.show();
add(fm);
}
}
import java.awt.Panel;
import java.awt.Color;
import java.awt.GridLayout;
public class FrameMosaik extends Panel
{
protected ModelIF mm;
public FrameMosaik(int raster, int breite, Color farbeRueck, Color farbeVor)
{
mm=new MosaikModel(raster,raster); //evtl. ModelIF statt MosaikModel S.48
//eventHandler=new MosaikEventHandler(mm);
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++)
{
FrameCanvas mc=new FrameCanvas (i,j,farbeRueck,farbeVor);
//mc.addMouseListener(eventHandler);
mm.putMObj(i,j,mc);
mc.setSize(canvasBreite, canvasBreite);
add(mc);
}
}
}
}
Roar: Codetags