【问题标题】:Can't change JProgressBar color in Mac OS look and feel无法更改 Mac OS 外观中的 JProgressBar 颜色
【发布时间】:2012-06-24 06:37:00
【问题描述】:

我知道这个问题之前已经回答过,但它对我不起作用。我按照这里的说明进行操作:How to change JProgressBar color?

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,它适用于新颜色。但是,我希望它具有默认的外观和感觉。我该怎么做?

【问题讨论】:

  • 1+ 赞成在您的第一篇帖子中发布带有格式化代码的有效sscce
  • 但是你的代码对我来说很好用。我看到请求的背景和前景色很好。我在运行 Java 1.7 的 Windows 7 机器上。
  • 我在 mac OS X 10.7.3 Java 1.6 上,我得到了你在屏幕截图上看到的内容。 @HovercraftFullOfEels:这是我的第二篇文章。谢谢。
  • 这可能是外观问题。考虑尝试另一种外观和感觉,看看会发生什么。我们必须看看其他 Mac 用户对您的代码有何体验。
  • 感谢您的反馈。当我设置不同的外观和感觉时,它看起来还不错。但我希望它具有 Mac 的默认外观。

标签: java swing colors look-and-feel jprogressbar


【解决方案1】:

要覆盖外观默认值,请在构造event dispatch thread 上的 GUI 之前进行更改,如下所示。

com.apple.laf.AquaLookAndFeel 上,进度条的UI 委托是com.apple.laf.AquaProgressBarUI 的一个实例。正如您所发现的,它忽略了许多支持本机组件的默认值。如果需要新颖的配色方案,请考虑提供您自己的 UI 委托,如 here 所示。

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.horizo​​ntalSize: 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;
            }
        });
    }
}

【讨论】:

  • 所以,没有 简单 的方法可以让多个 JProgressbar 具有 不同的颜色,但默认的 相同的样式 AquaProgressBarUI,我说的对吗? (我将无法编写我自己的 UI 委托,它看起来和默认的一样好)感谢您的回复。我没有足够的声誉直接投票或附上图片。
  • 是的,每个 UI 委托实现都拥有自己的设置;它可以采用其他 L&F 中使用的全部、部分或不采用。同时,没有什么可以阻止实例化MetalProgressBarUI 并在Aqua 中使用它,尽管我从未这样做过。准备好后,您可以点击左侧的empty check mark 接受此答案。
  • 您不能通过在创建进度条时更改整体 L&F 来使进度条采用不同的 L&F(然后将其设置回您之前存储的默认 L&F)吗?我想我在这里的某个地方读到了这个......
  • 一些 UI 委托像这样工作得很好;有些不是;你还没有尝试过。
猜你喜欢
  • 2021-02-22
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 2011-11-02
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多