Hallo Wissende,
Ich habe ein Applet geschrieben. Es handelt sich um eine Animation, genauer gesagt, einen Zellulären Automaten.
Nun gibt es eine Klasse Rechner, die die neuen Bildpunkte berechnet, und eine Klasse Animation, die sie zeichnet.
Hier der relevante Teil der Klasse Animation
...und der Klasse Rechner
Nun gibt es noch ein Applet mit der run-Methode
und eine Gui, auf der man mit Hilfe eines Buttons das Bild neu initiieren kann
Die Berechnung des Bildes ist übrigens recht aufwändig. Es sind pro Zyklus immerhin ca. 100 000 Bildpunkte zu berechenem, was etwa 250 ms dauert.
Problem : Wenn ich die Animation laufen lasse und dann denn Button drücke, macht er entweder (a) was er soll, (b) nichts oder (c) er erzeugt ein Bild, das aus einer wilden Mischung zwischen dem neuen und dem alten besteht.
Ich vermute, dass die per Button ausgelöste Erzeugung des neuen Bildes rechner.neuStart(); in die laufende Berechnung des Bildes "hineinplatzt", anstatt abzuwarten, dass das aktualisieren() abgeschlossen ist.
Frage : Hat das was mit Synchronisation zu tun ?
Ich habe schon versucht, die Methoden mit "synchronized" zu markieren, das bringt aber nichts (außer dass wohl häufiger nichts erzeugt wird). In der Literatur finde ich den Begriff nur im Zusammenhang mit mehreren Threads - aber ich habe doch nur einen !
Was kann ich tun ?
Ich habe ein Applet geschrieben. Es handelt sich um eine Animation, genauer gesagt, einen Zellulären Automaten.
Nun gibt es eine Klasse Rechner, die die neuen Bildpunkte berechnet, und eine Klasse Animation, die sie zeichnet.
Hier der relevante Teil der Klasse Animation
Java:
protected int anzBreite, anzHoehe, karo, breitePix, hoehePix, pix, rand=10;
protected int[] pixels;
protected MemoryImageSource source;
protected Image img;
Color hintergrund;
public Animation(int anzBreite, int anzHoehe, int karo, Color hintergrund)
{
this.anzBreite = anzBreite;
this.anzHoehe = anzHoehe;
this.karo = karo;
this.hintergrund = hintergrund;
breitePix = anzBreite*karo;
hoehePix = anzHoehe*karo;
pix = breitePix*hoehePix;
pixels = new int[pix];
source = new MemoryImageSource(breitePix, hoehePix,
pixels, 0, breitePix);
source.setFullBufferUpdates(true);
source.setAnimated(true);
source.setFullBufferUpdates(true);
img = createImage(source);
setBackground(hintergrund);
aktualisieren();
}
public void aktualisieren()
{
source.newPixels();
repaint();
}
public void paint(Graphics g)
{
g.drawImage(img, rand, rand, this);
}
public void setPixels(int[] pixels)
{
this.pixels = pixels;
}
}
...und der Klasse Rechner
Java:
public class Rechner
....
public void aktualisieren()
{
berechneBrett();
brettInPixels();
altern();
}
public void neuStart()
{
zufallsverteilung();
brettInPixels();
altern();
}
private void brettInPixels()
{
int farbe;
int[]pixels;
pixels = animation.getPixels();
for(int y=0; y<anzHoehe; y++)
for(int x=0; x<anzBreite; x++)
{
if(brettNeu[x][y]) farbe = blau;
else farbe = gelb;
for(int a=0; a<karo; a++)
for(int b=0; b<karo; b++)
pixels[karo*x +a +(b+y*karo)*breitePix] = farbe;
}
animation.setPixels(pixels);
}
Nun gibt es noch ein Applet mit der run-Methode
Java:
public void run()
{
while(laeuft)
{
rechner.aktualisieren();
animation.aktualisieren();
verzoegerung(500);
}
}
und eine Gui, auf der man mit Hilfe eines Buttons das Bild neu initiieren kann
Java:
bStart = new JButton(start);
bStart.setBackground(gruen);
bStart.setSize(40, 60);
bStart.addActionListener
(new ActionListener() // Start-Button
{ public void actionPerformed(ActionEvent e)
{
if(rechner.getLaufen())
{
rechner.setLaufen(false);
bStart.setBackground(gruen);
bStart.setText(start);
rechner.neuStart();
}
else
{
rechner.setLaufen(true);
bStart.setBackground(rot);
bStart.setText(neu);
}
}});
Problem : Wenn ich die Animation laufen lasse und dann denn Button drücke, macht er entweder (a) was er soll, (b) nichts oder (c) er erzeugt ein Bild, das aus einer wilden Mischung zwischen dem neuen und dem alten besteht.
Ich vermute, dass die per Button ausgelöste Erzeugung des neuen Bildes rechner.neuStart(); in die laufende Berechnung des Bildes "hineinplatzt", anstatt abzuwarten, dass das aktualisieren() abgeschlossen ist.
Frage : Hat das was mit Synchronisation zu tun ?
Ich habe schon versucht, die Methoden mit "synchronized" zu markieren, das bringt aber nichts (außer dass wohl häufiger nichts erzeugt wird). In der Literatur finde ich den Begriff nur im Zusammenhang mit mehreren Threads - aber ich habe doch nur einen !
Was kann ich tun ?