# java.awt.Color



## fk1988 (6. Jan 2013)

Hallo,

Ich programmiere gerade ein Spiel mit Fortschrittsbalken. Dieser Fortschrittsbalken ist nichts anderes, als eine simple Anzeige wielange ich noch Zeit habe um das Missionsziel zu erreichen.







Der Balken ist zu Spielbeginn auf 100% und grün. Mit Fortdauer des Spiels wird er zunächst gelblicher (50%), dann rötlicher (0%).


Nun zu meiner Frage:
Da ich mit jeden paintComponent() Aufruf den Balken aktualisiere muss ich für jeden Aufruf den aktuellen RGB Wert berechnen.


```
private Color GetProcessColor(int TimeProcessPercentage)
{
    double redPercentage = TimeProcessPercentage > 50 ? 255.0 - 255.0 / 50.0 * (TimeProcessPercentage-50.0) : 255;
    double greenPercentage = TimeProcessPercentage < 50 ? 255.0 / 50.0 * TimeProcessPercentage : 255;

    int r = java.lang.Math.max(0, (java.lang.Math.min(255, (int) redPercentage)));
    int g = java.lang.Math.max(0, (java.lang.Math.min(255, (int) greenPercentage)));
    int b = 0;

    Color colorProgress = new Color(r, g, b);    
    return colorProgress;
}
```

Wie ihr seht, erzeuge ich mit jedem Aufruf ein neues Color Object.

Ich habe keine Möglichkeit gefunden ein Object vom Typ Color nur einmal anzulegen und bei jedem Aufruf den aktuellen RGB Wert zu setzen. set() Methoden konnte ich in der sun Doku nicht finden.

Gibt es wirklich keine Möglichkeit ein bestehendes Color Object einen neuen RGB Wert anzugeben?

Es wäre doch weitaus performanter nicht ständig neue Objekte anzulegen.
Hier noch ein Code wie ich mir es vorstelle:


```
private Color GetProcessColor(int TimeProcessPercentage)
{
    double redPercentage = TimeProcessPercentage > 50 ? 255.0 - 255.0 / 50.0 * (TimeProcessPercentage-50.0) : 255;
    double greenPercentage = TimeProcessPercentage < 50 ? 255.0 / 50.0 * TimeProcessPercentage : 255;

    int r = java.lang.Math.max(0, (java.lang.Math.min(255, (int) redPercentage)));
    int g = java.lang.Math.max(0, (java.lang.Math.min(255, (int) greenPercentage)));
    int b = 0;

    if(colorProgress==null)   // member variable
      colorProgress = new Color(r, g, b);
    else 
      colorProgress.setRGB(r, g, b);

    return colorProgress;
}
```



PS. Da es immer heißt man sollte swing und awt nicht mischen, gibt es auch von swing eine Color Klasse? Oder gilt diese Regel nur für Fensterelemente (Buttons, Textfelder, Panels ...).


----------



## Timothy Truckle (6. Jan 2013)

fk1988 hat gesagt.:


> PS. Da es immer heißt man sollte swing und awt nicht mischen, gibt es auch von swing eine Color Klasse? Oder gilt diese Regel nur für Fensterelemente (Buttons, Textfelder, Panels ...).


Nein, [JAPI]java.awt.Color[/JAPI] wird auch in Swing benutzt, aber warum nutzt Du nicht [JAPI]JProgressBar[/JAPI]?

bye
TT


----------



## fk1988 (6. Jan 2013)

Timothy Truckle hat gesagt.:


> Nein, [JAPI]java.awt.Color[/JAPI] wird auch in Swing benutzt, aber warum nutzt Du nicht [JAPI]JProgressBar[/JAPI]?
> 
> bye
> TT



OK, damit wäre meine 2. Frage beantwortet.

zu deiner Frage:
Natürlich kann ich eine JProgressbar nehmen, das ändert aber nichts an meinem "Problem" ständig neue Color Objekte anzulegen.


----------



## Timothy Truckle (6. Jan 2013)

fk1988 hat gesagt.:


> Natürlich kann ich eine JProgressbar nehmen, das ändert aber nichts an meinem "Problem" ständig neue Color Objekte anzulegen.


Könnest Du die 3 Farben, die Du brauchst als Konstanten in Deinem Programm anlegen oder die in [JAPI]Color[/JAPI] definierten Farben nehmen. Um letzteres raus zu bekommen ist natürlich schwierig, wenn man eine API-Phobie hat...

bye
TT


----------



## fk1988 (6. Jan 2013)

Timothy Truckle hat gesagt.:


> Könnest Du die 3 Farben, die Du brauchst als Konstanten in Deinem Programm anlegen oder die in [JAPI]Color[/JAPI] definierten Farben nehmen. Um letzteres raus zu bekommen ist natürlich schwierig, wenn man eine API-Phobie hat...
> 
> bye
> TT



nein, ich verwende ja keine 3 konstante Farben.
Wie im 1. Posting geschrieben: die Farbe ändert sich mit jeder Änderung der Balkenlänge.
d.h. Aus grün wird langsam gelb, dass passiert bei Spielstart bis zur Hälfte der Spieldauer.
Ab der Hälfte bis zum Ende des Spiels wird aus gelb rot.


der Verlauf sieht in etwa so aus:


----------



## Timothy Truckle (6. Jan 2013)

dann schau mal hier:
http://www.java-forum.org/java-basics-anfaenger-themen/15163-farbverlauf-java.html

bye
TT


----------



## fk1988 (6. Jan 2013)

Timothy Truckle hat gesagt.:


> dann schau mal hier:
> http://www.java-forum.org/java-basics-anfaenger-themen/15163-farbverlauf-java.html
> 
> bye
> TT



Ich muss mich entschuldigen, ich habe mich nicht klar ausgedrückt. Ich kenne diese Methode, aber die liefert mir nicht das, was ich möchte.


Der gesamte Balken hat 1 Farbe, die sich je nach Zeit ändert -> siehe Bild im 1. Post.

100%..... RGB=     0, 255,   0
  75%..... RGB= 128, 255,   0
  50%..... RGB= 255, 255,   0
  25%..... RGB= 255, 128,   0
    0%..... RGB= 255,     0,   0

Der Balken ändert sich nicht nur in der Länge, sondern auch in der Farbe.


----------



## Landei (6. Jan 2013)

Mach doch einfach ein statisches Array mit 20 Farben deines Verlaufs (genauer sieht man das sowieso nicht), runde deinen Wert  auf 5% (nur für die Farbe, du kannst ja trotzdem die genaue Zahl anzeigen) und suche dir die entsprechende Farbe raus.


----------



## L-ectron-X (7. Jan 2013)

fk1988 hat gesagt.:


> Da es immer heißt man sollte swing und awt nicht mischen, gibt es auch von swing eine Color Klasse? Oder gilt diese Regel nur für Fensterelemente (Buttons, Textfelder, Panels ...).


Diese Aussage bezieht sich ausschließlich auf die GUI-Komponenten.


----------

