# g.setColor erzeugt falsche Farbe?



## manuche (25. Mrz 2008)

Hallo!
In meinem TankWar Spiel benutze ich ein JPanel mit einer Grafik um die Stärke des aktuellen Windes anzuzeigen.
Je nachdem, wie stark der Wind ist und in welche Richtung er weht, sollen über die Grafik weisse Rechtecke gezeichnet werden. Je nach Stärke verschieden groß. Die Grafik an sich ist ein einfacher Farbübergang von Rot zu Grün und dann wieder zu Rot, für beide Richtungen halt.
Allerdings werden die Rechtecke braun, auch wenn ich zuvor sage g.setColor (Color.WHITE)...
Mit Schwarz funktioniert das ganze wunderbar aber warum nicht mit weiss? Hier mal der Code:


```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class WindPanel extends JPanel{
	private static final long	serialVersionUID	= 3355135106963307780L;

	private BufferedImage actWind;
	private String path;

	public WindPanel(String path) {
		super ();
		this.path = path;
		this.loadPic (path);
	}

	@Override
	public void paint (Graphics g){
		super.paint (g);
		g.drawImage (actWind, 1, 1, this);
	}

	public void setActWind (int strength){
		this.loadPic (path);
		Graphics g = actWind.getGraphics ();
		if (strength >= 50){
			g.setColor (Color.WHITE);
			g.fillRect (0, 0, 50, 18);
			g.fillRect (strength, 0, 100, 18);
		}else{
			g.setColor (Color.WHITE);
			g.fillRect (50, 0, 50, 18);
			g.fillRect (0, 0, strength, 18);
		}
		this.repaint ();
	}

	private void loadPic (String pPath){
		URL pic_url = getClass ().getClassLoader ().getResource (pPath);
		try{
			actWind = ImageIO.read (pic_url);
		}catch (IllegalArgumentException iae){
			//
		}catch (IOException ioe){
			//
		}
	}
}
```

Und wenn wir schon dabei sind... Vllt gibt es sowieso eine schönere Lösung sowas zu lösen... 
Danke schonmal für Mühen und Aufwand!


----------



## SlaterB (25. Mrz 2008)

tja, jetzt hatte ich schonmal ne Menge Mühe, ein Testprogramm und ein Bild zurechtzustellen, 
(was du dir unverständlicherweise erspart hast)

bei mir ist aber alles weiß, wie sollte es auch anders sein 


```
public class TestGUI
    extends JFrame
{

    public TestGUI()
    {
        WindPanel p = new WindPanel("test.JPG");
        p.setActWind(60);
        add(p);
        setSize(200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        new TestGUI();
    }
}
```

lade doch mal deine Bilddatei hoch..


----------



## manuche (25. Mrz 2008)

*wisch wisch*
bilde ich mir anscheinend nicht ein 
mhh komisch... hier das bild:







könnte es evtl an opaque bzw nicht opaque liegen? halte ich bis jetzt allerdings für unsinnig, aber man weiss ja nie -.-


----------



## SlaterB (25. Mrz 2008)

ok, bei mir ist es nun recht grünlich,

sogar wenn ich in Windows-Paint mit weiß drauf male, wird es nicht weiß,
das liegt also an den Bildeinstellungen, nicht an Java


-------

wenn ich es mit Paint als jpg abspeichere, dann ist wieder alles ok

ansonsten klinke ich mich dann mal bei dieser tiefgraphischen Frage aus


----------



## Marco13 (25. Mrz 2008)

Hm, das ist ja ein GIF, und offenbar ist ImageIO so clever, dafür dann ein IndexedColorModel zu verwenden (wo sozusagen "WHITE" auf "BOOGER_GREEN" abgebildet wird...). 

Man kann ImageIO wohl sagen, von welchem Type das Bild sein soll, ... mußt du mal nachsehen - notfalls kann man es auch "per Hand" in ein BufferedImage vom gewünschten Typ malen

```
private void loadPic (String pPath){
      URL pic_url = getClass ().getClassLoader ().getResource (pPath);
      try{
         actWind = ImageIO.read (pic_url);
         System.out.println(actWind.getType()+" "+actWind.getColorModel());
         BufferedImage bi = new BufferedImage(actWind.getWidth(), actWind.getHeight(), BufferedImage.TYPE_INT_RGB);
         bi.getGraphics().drawImage(actWind,0,0,this);
         actWind = bi;
         System.out.println(actWind.getType()+" "+actWind.getColorModel());
      }catch (IllegalArgumentException iae){
         //
      }catch (IOException ioe){
         //
      }
   }
```
Q&D-Lösung, aber... Naja. (Wenn das Bild kein GIF sondern ein PNG wäre, würde sich dieses Problem vtml. nicht ergeben...)


----------



## manuche (25. Mrz 2008)

Ich hab das Bild jetzt einfach als jpg gespeichert und siehe da es funktioniert!!!
Vielen Dank dafür... Aber darauf wäre ich echt nicht gekommen!!!


----------

