无法在Mac OS外观中更改JProgressBar颜色
我知道这个问题之前已经得到了回答,但它对我不起作用。 我按照这里的说明: 如何更改JProgressBar颜色?
import javax.swing.*; import java.awt.*; public class ProgressBarTest extends JFrame { public static void main(String args[]) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); UIManager.put("ProgressBar.background", Color.orange); UIManager.put("ProgressBar.foreground", Color.black); UIManager.put("ProgressBar.selectionBackground", Color.red); UIManager.put("ProgressBar.selectionForeground", Color.green); JProgressBar progressBar = new JProgressBar(0,100); progressBar.setValue(50); f.add(progressBar, BorderLayout.PAGE_END); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } }
我得到的只是旧颜色。
我使用的是Mac OS X 10.7.3和Java 1.6。 我尝试了CrossPlatformLookAndFeel
,它适用于新颜色。 但是我希望这是默认的外观。 我怎样才能做到这一点?
要覆盖Look&Feel默认值,请在事件派发线程上构建GUI 之前进行更改,如下所示。
在com.apple.laf.AquaLookAndFeel
,进度条的UI委托是com.apple.laf.AquaProgressBarUI
一个实例。 正如您所发现的,它忽略了许多默认值,而不是原生组件。 如果需要新颖的配色方案,请考虑提供您自己的UI委托,如下所示。
AquaProgressBarUI
:
CustomProgressUI:
ProgressBar UI默认值:
ProgressBar.background:com.apple.laf.AquaNativeResources $ CColorPaintUIResource [r = 238,g = 238,b = 238] ProgressBar.border:javax.swing.plaf.BorderUIResource@47f08ed8 ProgressBar.cellLength:1 ProgressBar.cellSpacing:0 ProgressBar.cycleTime:3000 ProgressBar.font:sun.swing.SwingLazyValue@6446d228 ProgressBar.foreground:javax.swing.plaf.ColorUIResource [r = 0,g = 0,b = 0] ProgressBar.horizontalSize:javax.swing.plaf.DimensionUIResource [width = 146,height = 12] ProgressBar.repaintInterval:20 ProgressBar.selectionBackground:javax.swing.plaf.ColorUIResource [r = 255,g = 255,b = 255] ProgressBar.selectionForeground:javax.swing.plaf.ColorUIResource [r = 0,g = 0,b = 0] ProgressBar.verticalSize:javax.swing.plaf.DimensionUIResource [width = 12,height = 146] ProgressBarUI:com.apple.laf.AquaProgressBarUI
SSCCE:
import java.awt.*; import javax.swing.*; public class ProgressBarTest extends JFrame { public static void main(String args[]) { UIManager.put("ProgressBar.repaintInterval", 100); UIManager.put("ProgressBar.border", BorderFactory.createLineBorder(Color.blue, 2)); EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame(); f.setLayout(new GridLayout(0, 1, 5 , 5)); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(createBar()); f.add(createBar()); f.add(createBar()); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } private JProgressBar createBar() { JProgressBar progressBar = new JProgressBar(0, 100); progressBar.setValue(50); return progressBar; } }); } }