Swing JProgressbar im Windows Look & Feel Farbanpassung

Angry Onion

Mitglied
Hallo,

ich habe in einem JFrame 6 JProgressBars und möchte gerne, dass sie, je nach Fortschritt, verschiedene Farben haben. Das heißt, bei 0% rot, bei 50% gelb und bei 100% grün.

Einen schönen Farbverlauf habe ich bereits hinbekommen und wenn ich das Standard L&F von Java benutze funktioniert es auch.

Gibt es eine Möglichkeit, die JProgressBars auch im Windows L&F irgendwie individuell anzupassen, am besten abhängig von ihrem Wert?

UIManager.put("ProgressBar.background", Color.BLACK); //colour of the background
UIManager.put("ProgressBar.foreground", Color.RED); //colour of progress bar
UIManager.put("ProgressBar.selectionBackground",Color.YELLOW); //colour of percentage counter on black background
UIManager.put("ProgressBar.selectionForeground",Color.BLUE); //colour of precentage counter on red background

Habe jetzt schon mehrere Sachen gelesen, wie man generell die Farbe ändern kann mit UIManager. Doch nichtmal das hat funktioniert.

Dankeschön im Vorraus,

Yannic
 
Ich denke nicht, dass das geht. Nach meiner Auffassung werden - wenn du das LAF über UIManager.getSystemLookAndFeelClassName() setzt - die Komponenten vom OS gemalt (sprich der selbe Code der auch die anderen Komponenten der Windows-Oberfläche rendert). Den wirst du so einfach nicht beeinfluss können, vllt hilft dir ein JNI-Trick.
 
da würden mir spontan folgende ansätze einfallen:

1) [Unschön] der thread der deine aktion durchführt steuert die farbe gleich mit... finde ich nicht ganz so elegant, da damit die steuerlogic für die farbe nicht so recht da sitzt, wo sie hingehört

Java:
package customProgressBar;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class ProgressBarDemo extends JFrame
{
	JProgressBar pBar = null;
	
	Thread progresser = new Thread(new Runnable()
	{
		@Override
		public void run()
		{
			while (!Thread.currentThread().isInterrupted())
			{
				int newVal = 0;
				
				if (pBar.getValue() != 100)
				{
					newVal = pBar.getValue()+1;
					
					if (newVal <30)
					{
						pBar.setForeground(Color.red);
					}
					else if (newVal < 60)
					{
						pBar.setForeground(Color.yellow);
					}
					else
					{
						pBar.setForeground(Color.green);
					}
				}
				pBar.setValue(newVal);
				try
				{
					Thread.sleep(200);
				}
				catch (InterruptedException e){}
			}
		}
	});
	
	public ProgressBarDemo()
	{
		this.addWindowListener(new WindowAdapter()
		{
			@Override
			public void windowClosing(WindowEvent e)
			{
				progresser.interrupt();
			}
		});
		
		this.setSize(200,100);
		pBar = new JProgressBar();
		pBar.setValue(0);
		pBar.setBackground(Color.black);
		this.setLayout(new FlowLayout());
		this.add(pBar);
		this.setVisible(true);
		
		progresser.start();
	}
	
	public static void main(String[] args)
	{
		new ProgressBarDemo();
	}
}

2) [Hüpbscher] du kannst von JProgressbar erben und die hintergrundfarbe anpassen wenn ein neuer wert gesetzt wird

Java:
package customProgressBar;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class ProgressBarDemo extends JFrame
{
	CustomProgressBar pBar = null;
	
	Thread progresser = new Thread(new Runnable()
	{
		@Override
		public void run()
		{
			while (!Thread.currentThread().isInterrupted())
			{
				int newVal = 0;
				
				if (pBar.getValue() != 100)
				{
					newVal = pBar.getValue()+1;
				}
				pBar.setValue(newVal);
				try
				{
					Thread.sleep(200);
				}
				catch (InterruptedException e){}
			}
		}
	});
	
	public ProgressBarDemo()
	{
		this.addWindowListener(new WindowAdapter()
		{
			@Override
			public void windowClosing(WindowEvent e)
			{
				progresser.interrupt();
			}
		});
		
		this.setSize(200,100);
		pBar = new CustomProgressBar();
		pBar.setValue(0);
		pBar.setBackground(Color.black);
		this.setLayout(new FlowLayout());
		this.add(pBar);
		this.setVisible(true);
		
		progresser.start();
	}
	
	public static void main(String[] args)
	{
		new ProgressBarDemo();
	}
}

Java:
package customProgressBar;

import java.awt.Color;

import javax.swing.JProgressBar;

public class CustomProgressBar extends JProgressBar
{
	@Override
	public void setValue(int n)
	{
		super.setValue(n);
		if (n <30)
		{
			this.setForeground(Color.red);
		}
		else if (n < 60)
		{
			this.setForeground(Color.yellow);
		}
		else
		{
			this.setForeground(Color.green);
		}
	}
}
 

Zurück
Oben