Unerwünschter Farbverlauf bei Transparanz

Goldinho

Aktives Mitglied
Hallo. Schachprojekt. Die möglichen Felder werden gehighlightet, sobald die Figur mit der Maus angefasst wird.
Die Farbe benötigt eine Transparanz, sonst schaut es doof aus. Also habe ich der Farbe mit
Java:
privateColor highLightCol = new Color(124,252,0,5);
einen Alpha-Wert gegeben.

Aus mir nicht erfindlichen Gründen erscheint zusätzlich zur Transparenz ein Farbverlauf über die gesamte Fensterhöhe, so dass die unteren Felder kaum gehighlightet werden (siehe Screenshot).
12923
Hat irgendjemand eine Idee, wo ich ansetzen kann, um das zu beheben?

Gruß Christian
 

Goldinho

Aktives Mitglied
Hm... das sieht aus, wie wenn man im Zeichenprogramm mehrfach mit halbtransparenter Farbe pinselt...

Guter Hinweis. Ich denke, das ist es. Die Felder werden durchs repaint(), das vom MouseDragged aufgerufen wird, immer wieder überpinselt und dann entsteht aus irgendwelchen Gründen der Verlauf von unten nach oben.

Hab jetzt zwar noch keine Idee, wie ich das fixe, aber ich hab zumindest mal nen Ansatzpunkt. Danke!
 
X

Xyz1

Gast
Sollen wir ohne Code raten wo der Schuh drückt? Dann trinke ich lieber meinen Kaffee. :) denn der Kaffeesatz scheint da mehr herzugeben :D

Btw. @mihe7 , kannst Du dich noch an mein AI-Problem erinnern (PN) - das funktioniert nun proper. :)
 

Goldinho

Aktives Mitglied
Sollen wir ohne Code raten wo der Schuh drückt? Dann trinke ich lieber meinen Kaffee. :) denn der Kaffeesatz scheint da mehr herzugeben :D

Btw. @mihe7 , kannst Du dich noch an mein AI-Problem erinnern (PN) - das funktioniert nun proper. :)

Trink doch einfach deinen Kaffee, hab ich nix dagegen. Solange du dann hier nichts schreibst.....
Ich kann dir gern 1000 Zeilen Code hier reinkopieren, dann versprichst du aber auch, dass du dich auf die Suche machst.

Ist doch ziemlich eindeutig, dass das nicht einfach ein kleiner Fehler im Code ist, sondern ein strukturelles Problem. Der Hinweis von mihe7 hilft mir schon, so dass ich es rauskriege.

Ich muss halt dafür sorgen, dass die Felder nur einmal eingefärbt werden und nicht permanent, während die Figur gedragged wird. Ist halt schwierig, weil das komplette Feld ja auch die ganze Zeit repainted wird :rolleyes:
ich müsste irgendwie testen, ob ein Feld schon grün ist, so dass es dann nicht wieder eingefärbt wird. Das wiederum geht nicht, weil die Felder keine Objekte sind, sondern einfach nur mit fillRect gemalt werden. Hmmmmmmmmm
 

mihe7

Top Contributor
Ich kann dir gern 1000 Zeilen Code hier reinkopieren, dann versprichst du aber auch, dass du dich auf die Suche machst.
Du kannst ein Zip-File anhängen (auch, wenn das @Tobias-nrw nicht gerne aufmacht :) )

Ich muss halt dafür sorgen, dass die Felder nur einmal eingefärbt werden und nicht permanent, während die Figur gedragged wird. Ist halt schwierig, weil das komplette Feld ja auch die ganze Zeit repainted wird
Verstehe die Logik gerade nicht. Wenn Du eine Figur auswählst, weißt Du doch welche Felder hervorgehoben werden müssen. Beim repaint() sollte doch das ganze Feld (inkl. Hintergrund) neu gezeichnet werden. Sprich: Hintergrund (nicht transparent), Highlight (semi-transparent) und Figur.
 

Goldinho

Aktives Mitglied
Du kannst ein Zip-File anhängen (auch, wenn das @Tobias-nrw nicht gerne aufmacht :) )
Das kannst du vergessen. Meinen Code versteht kein Mensch außer mir. Beim nächsten Projekt wird alles besser. ;)

Verstehe die Logik gerade nicht. Wenn Du eine Figur auswählst, weißt Du doch welche Felder hervorgehoben werden müssen. Beim repaint() sollte doch das ganze Feld (inkl. Hintergrund) neu gezeichnet werden. Sprich: Hintergrund (nicht transparent), Highlight (semi-transparent) und Figur.

Das ist ja auch so. Aber da liegt anscheinend das Problem. Wenn ich die Figur dragge, dann wird pro Zug das komplette Feld inclusive der zu highlightenden Felder und der Figuren im Schnitt etwa 5-10.000 mal repainted (ich hab mal nen Counter mitlaufen lassen). Und die transparenten Felder mögen das aus irgendeinem Grund nicht und bilden diesen Verlauf.
 

mihe7

Top Contributor
Nur, damit wir nicht aneinander vorbeischreiben: wenn in einem repaint() immer sowohl der nicht-transparente Hintergrund als auch das darüber liegende Highlight gezeichnet wird, muss das Ergebnis doch immer das gleiche sein?!?
 

Goldinho

Aktives Mitglied
Nur, damit wir nicht aneinander vorbeischreiben: wenn in einem repaint() immer sowohl der nicht-transparente Hintergrund als auch das darüber liegende Highlight gezeichnet wird, muss das Ergebnis doch immer das gleiche sein?!?

Ja, solange man eine bestimmte Figur anfasst. Sobald eine Figur angefasst wird, werden die möglichen Züge dieser Figur in einer ArrayList namens HighLightFields gespeichert, die wiederum dann repaintet wird. Wenn man eine andere anfasst, ändern sich auch die HighLightFields. Das funktioniert ja alles prima. Nur diesen Verlauf kann ich mir nicht erklären.
 

Goldinho

Aktives Mitglied
Das steht in der paint-Methode meiner Graphics g

Java:
if (highLighter == true) {
            g.setColor(HighLight);
            //System.out.println(HighLightFields.toString());  
            for (String HL: HighLightFields) {
                String[] HLK = HL.split("-");
                int hl_h = Integer.parseInt(HLK[0]);
                int hl_v = Integer.parseInt(HLK[1]);
                if (rotated == false) {            
                        g.fillRect(middle+(hl_h*size),middle+(9-hl_v)*size,size,size);
                        }
                else {
                        g.fillRect(middle+((9-hl_h)*size),middle+(hl_v*size),size,size);
                    }
            }
}

Sobald ich eine Figur anfasse, werden über das MausEvent MouseDragged die HighLightFields befüllt und wie die ganze Zeit repainted.
 

Goldinho

Aktives Mitglied
Ich habs. Puh. Manchmal bin ich so ein Trottel.
Ich hatte die Zeichnung der HighlightFields innerhalb der for-Schleife, die die normalen Felder gezeichnet hat.
Damit ist sie bei jedem Repaint dutzendfach durchlaufen worden.

Aber dein Hinweis, dass die Felder offenbar mehrfach gezeichnet werden, war der entscheidende Ansatz. Danke dir!!!!
 

Ähnliche Java Themen

Neue Themen


Oben