Wie kann man eine Statusanzeige erzeugen, deren Farbigkeit sich in Abhängigkeit vom angezeigten Statuswert ändert?
Sie erweitert die Klasse JProgressBar. Im Konstruktor, dem der Minimum- und Maximumwert der Anzeige übergeben wird,
wird eine Instanz der BasicProgressBarUI erzeugt.
Sie könnte für das hier gezeigte Vorhaben völlig leer bleiben.
Zur Demonstration überschreibt sie jedoch die
beiden Methoden getSelectionForeground() und
getSelectionBackground(), mit denen die Farben des Textes im Statusbalken
angepasst werden können. Die erste Methode ist für die Textfarbe über dem "gefüllten" Balken,
die zweite für die Textfarbe vor dem leeren Hintergrund des Balkens verantwortlich.
Das UI wird mittels setUI der JProgressBar zugeordnet.
Die anderen im Konstruktor der Klasse aufgerufenen Methoden stellen einige gängige Möglichkeiten dar,
eine JProgressBar den eigenen Bedürfnissen anzupassen.
class FarbigeProgressBar extends JProgressBar {
public FarbigeProgressBar(int start, int end) {
[...]
BasicProgressBarUI ui = new BasicProgressBarUI() {
protected Color getSelectionForeground(){
return Color.BLACK;
}
protected Color getSelectionBackground(){
return Color.BLACK;
}
};
setUI(ui);
}
}
Die Klasse FarbigeStatusAnzeige stellt neben einem JButton
zum Start des kleinen Programms
den JFrame bereit, auf dem die ProgressBar angezeigt wird.
Außer der main()-Methode zum Aufruf der Applikation
ist als einzige Methode nur der Konstruktor vorhanden. Neben den üblichen Konfigurationen des JFrame wird in ihm
ein Runnable-Objekt gebildet, das es ermöglicht,
die Statusanzeige in einem eigenen Thread laufen zu lassen,
um andere Kompomenten, wie z.B. den Button bedienbar zu halten.
Hier werden zunächst zwei Variablen für die Farbsteuerung deklariert und mit entsprechenden Werten initialisiert.
Ziel ist eine Anzeigefarbigkeit, die von Grün über Gelb nach Rot läuft.
Grün erhält somit zunächst den Maximal-, Rot
den Minimalwert. Das Gelb ergibt sich aus der additiven Mischung von Rot und Grün. Blau ist gar nicht beteiligt und
wird somit durchgängig auf 0 gesetzt. Um ein Ein- und Ausblenden der jeweiligen Farben zu erreichen wird ein
konstanter Faktor definiert, der im farbigen Übergangsbereich addiert bzw. subtrahiert wird.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicProgressBarUI;
public class FarbigeStatusAnzeige extends JFrame {
FarbigeProgressBar bar;
JButton button;
int max = 4000, min = 0;
public FarbigeStatusAnzeige() {
bar = new FarbigeProgressBar(min, max);
bar.setValue(max);
bar.setStringPainted(true);
final Runnable runnable = new Runnable() {
int rot = 0, gruen = 255;
double faktor = max / 255 / 2;
public void run() {
for (int i = max; i > min; i--) {
if (i < max / 5 * 2) {
rot += faktor / 5;
}
if (i < max / 10) {
gruen -= faktor / 25;
rot += faktor / 15;
}
rot = rot > 255 ? 255 : rot;
rot = rot < 0 ? 0 : rot;
gruen = gruen > 255 ? 255 : gruen;
gruen = gruen < 0 ? 0 : gruen;
bar.setForeground(new Color(rot, gruen, 0));
bar.setValue(i);
try {
Thread.sleep(5);
} catch (InterruptedException ex) {
}
}
rot = 0;
gruen = 255;
}
};
button = new JButton("start");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread thread = new Thread(runnable);
thread.start();
}
});
setLayout(new BorderLayout());
add(button, BorderLayout.SOUTH);
add(bar, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
new FarbigeStatusAnzeige();
}
}
class FarbigeProgressBar extends JProgressBar {
public FarbigeProgressBar(int start, int end) {
setMinimum(start);
setMaximum(end);
setForeground(SystemColor.window);
setBackground(SystemColor.window);
setBorder(new EmptyBorder(3, 5, 3, 5));
Dimension size = new Dimension(300, 20);
setPreferredSize(size);
setMaximumSize(size);
setMinimumSize(size);
BasicProgressBarUI ui = new BasicProgressBarUI() {
protected Color getSelectionForeground(){
return Color.BLACK;
}
protected Color getSelectionBackground(){
return Color.BLACK;
}
};
setUI(ui);
}
}
In der Methode run() des Threads durchläuft eine Schleife die Anzeigewerte
vom Maximum zum Minimum und setzt
für jeden Wert die Vordergrundfarbe. Diese wird durch zwei if-Verzweigungen definiert,
in denen die Abnahme und Zunahme
der Farbanteile für die beiden Übergangsbereiche berechnet werden. Sie sind, wie auch die Farbwerte
und der Berechnungsfaktor, an die eigenen Wünsche anpassbar. Wichtig ist, dass die Werte nicht den erlaubten Bereich
von minimal 0 und maxima 255 unter- bzw. überschreiten. Der letzte Ausdruck im Konstruktor simuliert einen
zeitintensiven Bearbeitungsvorgang, indem der Thread für kurze Zeit zum Pausieren veranlasst wird.