# PaintComponent zeichnet in falscher reihenfolge



## Stormblade (9. Nov 2012)

Hallihallo, ich habe nun unter anderem mithilfe eines bufferedimages ein 4gewinnt-spiel programmiert. 
Ich war echt stolz darauf, da es richtig objektorientiert geschrieben is, doch dann kam heute bei der verfeinerung der darstellung ein echt nerviger bug auf. Im unten stehenden Codeschnippsel ist zu erkennen, dass die paintslide()-methode zum beispiel die methode Gitter.zeichnen() aufruft. Der bug bei der ausführung des programms ist, dass zwar die einzelnen bilder bei dem ersten "animations-frame" in der richtigen reihenfolge aufeinander gelegt werden, jedoch lädt zuallererst der rahmen des Gitters, dann mit einigem abstand das gitter selbst, und dann die übrigen bilder. Das ist natürlich nicht so tragisch, wenn ich das alles schnell ablaufen lasse, doch es bleibt immer ein kurzes aufblitzen des hintergrunds beim starten des programms. 
Kurz gefragt, warum werden die einzelnen komponenten nicht in der angegebenen reihenfolge gezeichnet??? Was kann ich tun, um diesen unwichtigen Schönheitsfehler dennoch zu beheben?


```
klasse Spielerwahlpanel:
...
public static void paintslide2(Graphics g)
{
    g.drawImage(bgingame, 0, 0, 800, 600, null);
    Gitter.zeichneGitter(g, 280, 100);
    g.drawImage(backgroundleft, e, 0, 400, 600, null);
    g.drawImage(backgroundright, h, 0, 400, 600, null);
    Bild.bildzeichnen(g, e+150, 250, array1stelle);
    Bild.bildzeichnen(g, h+150, 250, array2stelle);
} 
...
```


```
klasse Gitter:
...
public static void zeichneGitter(Graphics g, int abstandx, int abstandy)
{  //hier das zeichnen des gitters durch zusammenfügen von bildern
    for(int i=0; i<gitterhoehe; i++){
        for(int j=0; j<gitterbreite; j++){
	g.drawImage(kasten, abstandx+j*breite, abstandy+i*breite, breite, breite, null);
        }
    }	
    //nachfolgend der rahmen
    g.setColor(Color.decode("666666"));
    g.fillRect(abstandx-dicke, abstandy-dicke, gitterbreite*breite+2*dicke, dicke);   
    g.fillRect(abstandx-dicke, abstandy+gitterhoehe*breite, gitterbreite*breite+2*dicke, dicke);		
    g.fillRect(abstandx-dicke, abstandy-dicke, dicke, gitterhoehe*breite+2*dicke);
    g.fillRect(abstandx+gitterbreite*breite, abstandy-dicke, dicke, gitterhoehe*breite+2*dicke);
}
```

Mit repaint() wird das bufferedimage immer neugezeichnet. der fehler tritt wie gesagt nur beim start der animation auf, und das nur für einen "Tic".


----------



## OOP? (9. Nov 2012)

Etwas OT: Warum sind die Zeichen Methoden Static wenn es doch "richtig" Objektorientiert ist?


----------



## Stormblade (9. Nov 2012)

oookee, ich bin anfänger  und ich dachte, objektorientiert heißt, dass ich 100 exemplare einer klasse erzeugen kann, die alle deren eigenschaften besitzen... Deren Methoden kann ich von außen nur aufrufen, wenn sie static sind, sonst meckert mein eclipse immer.


----------



## Marco13 (10. Nov 2012)

Ja, sieht etwas seltsam aus... aber zum eigentlichen Problem: Wie und wo werden die Bilder geladen?


----------



## Stormblade (10. Nov 2012)

Jede klasse, die bilder verwendet besitzt bei mir eine bildlade-methode. diese wird in der main-methode beim programmstart geladen. dabei werden sie dann in den jeweiligen klassen den dortigen Image-variablen zugeteilt.

nochmal ne frage zu objektorientiert: muss sich ein "objekt" etwa ohne zeichenbefehl von ausen selber zeichnen? darf ich nicht von ausen sagen "zeichne dich jetzt!", wie ich das zum beispiel bei Gitter.zeichnegitter() mache?


----------



## L-ectron-X (10. Nov 2012)

Wie man in Java zeichnet:
Malen in AWT und Swing ? Byte-Welt Wiki
Malen in Swing Teil 1: der grundlegende Mechanismus ? Byte-Welt Wiki


----------



## Stormblad (10. Nov 2012)

Vielen dank (facepalm) ich weiß doch, wie man zeichnet  Ich war nur in meinem lösungsweg irritiert, weil oben gesagt wurde, dass ich nicht objektorientiert programmieren würde ... Mein Problem hat glaube ich keine Lösung  ich habe den fehler schon mit anderen programmierern besprochen und alle fragen sich warum die bilder nicht im ersten frame dargestellt werden 
Sehr merkwürdig, das java, sehr merkwürdig


----------



## Marco13 (11. Nov 2012)

Verwendest du ImageIO? 
(Ja, ist schon komisch, dass etliche tausend oder gar Millionen von Programmen funktionieren, aber deins nicht - woran das wohl liegt?)


----------



## L-ectron-X (11. Nov 2012)

Wie man in Java Bilder laden kann:
Grafikdateien laden und anzeigen ? Byte-Welt Wiki

Probem könnte das Laden von Bildern mit Toolkit ohne MediaTracker sein.
Aus deinem Code kann man das nicht entnehmen.


----------

