PaintComponent zeichnet in falscher reihenfolge

Stormblade

Mitglied
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?

Java:
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);
} 
...
Java:
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".
 
O

OOP?

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

Stormblade

Mitglied
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. :)
 

Stormblade

Mitglied
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?
 
S

Stormblad

Gast
Vielen dank (facepalm) ich weiß doch, wie man zeichnet :D 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

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

Ähnliche Java Themen

Neue Themen


Oben