g.setColor erzeugt falsche Farbe?

Status
Nicht offen für weitere Antworten.

manuche

Bekanntes Mitglied
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:

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!
 
S

SlaterB

Gast
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

Code:
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

Bekanntes Mitglied
*wisch wisch*
bilde ich mir anscheinend nicht ein ;)
mhh komisch... hier das bild:

windzr2.gif


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

SlaterB

Gast
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

Top Contributor
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
Code:
   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

Bekanntes Mitglied
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!!!
 
Status
Nicht offen für weitere Antworten.

Oben