Java 设置JProgressBar文本颜色

Java 设置JProgressBar文本颜色,java,swing,colors,jprogressbar,Java,Swing,Colors,Jprogressbar,我有一个叫做playerhealth的JProgressBar。我把吧台的颜色改成绿色。这使得文本很难看到,因此我想将JProgressBar中文本的颜色设置为黑色 我了解到可以使用UIManager设置JProgressBars的全局颜色,但我只想为这一个(和另一个,但这并不重要) 我还了解到,我唯一的其他选择是修改JProgressBar类。我该怎么办 您可以将SetStringPaint属性设置为true: progressBar.setStringPainted(true); progr

我有一个叫做playerhealth的JProgressBar。我把吧台的颜色改成绿色。这使得文本很难看到,因此我想将JProgressBar中文本的颜色设置为黑色

我了解到可以使用UIManager设置JProgressBars的全局颜色,但我只想为这一个(和另一个,但这并不重要)


我还了解到,我唯一的其他选择是修改JProgressBar类。我该怎么办

您可以将SetStringPaint属性设置为true:

progressBar.setStringPainted(true);
progressBar.setForeground(Color.blue);
progressBar.setString("10%");

看看源代码,这并不容易

颜色存储在
BasicProgressBarUI
类中:

  • 在构造函数中,使用静态方法从
    UIManager
    检索颜色。静态方法意味着您无法覆盖调用
  • 颜色存储为私有字段,该类只公开受保护的getter,不公开setter。没有setters意味着你不能在外部调用它
用于
JProgressBar
ProgressBarUI
实例源自
UIManager
UIManager#getUI
),这也是一种静态方法

这让我们没有那么多选择。我认为可行的方法是使用
JProgressBar#setUI
方法:

  • 这允许您创建自己的UI实例
  • 这允许覆盖受保护的getter
这种方法的主要缺点是,它要求您预先知道应用程序将使用的外观和感觉。例如,如果应用程序使用金属,这将成为

JProgressBar progressBar = ... ;
ProgressBarUI ui = new MetalProgressBarUI(){
  /**
   * The "selectionForeground" is the color of the text when it is painted
   * over a filled area of the progress bar.
   */
  @Override
  protected Color getSelectionForeground() {
    //return your custom color here
  }
  /**
   * The "selectionBackground" is the color of the text when it is painted
   * over an unfilled area of the progress bar.
   */
  @Override
  protected Color getSelectionBackground()
    //return your custom color here
  }
}
progressBar.setUI( ui );

由于必须事先了解外观和感觉这一主要缺点,您对该解决方案不是100%满意。

您必须小心使用您的外观和感觉!(不同的外观意味着不同的反应..在设置StringPaint()和.setForeground(颜色)(由您选择)条后,如果看不到反应,请使用barname.setO乳(true);我不确定look and feel的作用是什么。如果我还没有真正使用它,它会改变什么吗?您拥有/使用look and feel,无论您是否想要它。是look and feel定义了组件的外观SetString绘制属性决定了字符串是否会出现在进度条上,而不是strin是否会出现g被涂成不同的颜色。