使用Nimbus更改JProgressBar的颜色?

有没有人知道如何在使用Nimbus LookAndFeel时更改JProgressBar的颜色?

我已经覆盖了整个nimbusOrange -Default值,它改变了所有ProgressBar-Colors和任何其他nimbusOrange(InternalFrame – 最小化按钮)
这里有nimbusBase (蓝色)

 UIDefaults defaults = UIManager.getLookAndFeelDefaults(); defaults.put("nimbusOrange",defaults.get("nimbusBase")); 

更好的是编写一个自己的Painter并将其设置为UIManager via

 UIManager.put("ProgressBar[Enabled].backgroundPainter", myPainter); 

如果要仅为单个ProgressBar实例更改“颜色”,则可以使用“ 每个组件自定义”

 progress = new JProgressBar(); UIDefaults defaults = new UIDefaults(); defaults.put("ProgressBar[Enabled].backgroundPainter", new MyPainter()); progress.putClientProperty("Nimbus.Overrides.InheritDefaults", Boolean.TRUE); progress.putClientProperty("Nimbus.Overrides", defaults); 

MyPainter的一个例子如下:

 class MyPainter implements Painter { private final Color color; public MyPainter(Color c1) { this.color = c1; } @Override public void paint(Graphics2D gd, JProgressBar t, int width, int height) { gd.setColor(color); gd.fillRect(0, 0, width, height); } } 

但我的编译器或IDE(eclipse)说它不知道画家。 有人帮我吗?

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import javax.swing.UIManager; public class JProgressBarDemo extends JFrame { protected int minValue = 0; protected int maxValue = 100; protected int counter = 0; protected JProgressBar progressBar; public JProgressBarDemo() { super("JProgressBar Demo"); setSize(300, 100); 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 progressBar = new JProgressBar(); progressBar.setMinimum(minValue); progressBar.setMaximum(maxValue); progressBar.setStringPainted(true); JButton start = new JButton("Start"); start.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Thread runner = new Thread() { public void run() { counter = minValue; while (counter <= maxValue) { Runnable runme = new Runnable() { public void run() { progressBar.setValue(counter); } }; SwingUtilities.invokeLater(runme); counter++; try { Thread.sleep(100); } catch (Exception ex) { } } } }; runner.start(); } }); getContentPane().add(progressBar, BorderLayout.CENTER); getContentPane().add(start, BorderLayout.WEST); WindowListener wndCloser = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; addWindowListener(wndCloser); setVisible(true); } public static void main(String[] args) { new JProgressBarDemo(); } }