【问题标题】:Nimbus L&F - Change Background color of Progress BarNimbus L&F - 更改进度条的背景颜色
【发布时间】:2012-08-01 22:12:12
【问题描述】:

我正在使用 Netbeans 编辑器使用 Java 开发一个小的 GUI 应用程序。 我在 JFrame 中放入了一个简单的进度条。 我正在用JDK7开发项目

我想将背景颜色从默认的橙色更改为个人颜色。我已经尝试了颜色更改的所有属性,但是当我运行程序时颜色仍然相同。

我已经尝试过使用 ProgressBar1.setBackground(new java.awt.Color(0, 204, 255));

UIManager.put("ProgressBar.background", Color.YELLOW);
UIManager.put("ProgressBar.foreground", Color.MAGENTA);
UIManager.put("ProgressBar.selectionBackground", Color.red);
UIManager.put("ProgressBar.selectionForeground", Color.green);

同样的结果.....背景总是橙色

这里是我的测试项目的代码

public class Frame extends javax.swing.JFrame
{

    public Frame()
    {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jProgressBar1 = new javax.swing.JProgressBar();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jProgressBar1.setBackground(new java.awt.Color(0, 204, 255));
        jProgressBar1.setValue(75);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    public static void main(String args[])
    {
        try
        {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Frame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JProgressBar jProgressBar1;
    // End of variables declaration
}

这是您启动代码时的结果
(来源:uploadscreenshot.com

橙色....

编辑 使用以下代码

UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled].backgroundPainter", new FillPainter(Color.MAGENTA)); 
UIManager.getLookAndFeelDefaults().put("ProgressBar[Disabled].backgroundPainter", new FillPainter(Color.MAGENTA)); 
UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled+Indeterminate].progressPadding", new FillPainter(Color.ORANGE)); 
UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled].foregroundPainter", new FillPainter(Color.GREEN)); 
UIManager.getLookAndFeelDefaults().put("ProgressBar[Disabled].foregroundPainter", new FillPainter(Color.GREEN)); 
UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled+Finished].foregroundPainter", new FillPainter(Color.GREEN)); 
UIManager.getLookAndFeelDefaults().put("ProgressBar[Disabled+Finished].foregroundPainter", new FillPainter(Color.GREEN)); 
UIManager.getLookAndFeelDefaults().put("ProgressBar[Disabled+Indeterminate].foregroundPainter", new FillPainter(Color.GREEN)); 
UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled+Indeterminate].foregroundPainter", new FillPainter(Color.GREEN)); `

在这行之后

javax.swing.UIManager.setLookAndFeel(info.getClassName());

我已成功更改背景颜色。 但是现在颜色是“素色”,没有像橙色那样的渐变。


(来源:uploadscreenshot.com

是否可以改变颜色与原色相同的效果?

【问题讨论】:

  • 我认为这是您使用的 LaF 的问题。稍等一下,我进行了一些测试。
  • 我在这个世界角落的@Andrew Thompson 是 SSCCE non_accesible,或者我的 squid_proxy 又出现问题了
  • 我在这里编辑了您的帖子并添加了代码,如果...,请恢复更改,问题现在可以清楚并可以回答

标签: java swing colors jprogressbar nimbus


【解决方案1】:
  1. 也许(ColorFont)在谈论 Nimbus Look and Feel 时有问题

  2. 必须check this thread

  3. 价值

ProgressBar[Disabled+Finished].foregroundPainter ProgressBar[Disabled+Indeterminate].foregroundPainter
ProgressBar[Disabled].backgroundPainter ProgressBar[Disabled].foregroundPainter ProgressBar[Enabled+Finished].foregroundPainter ProgressBar[Enabled+Indeterminate].foregroundPainter ProgressBar[Enabled+Indeterminate].progressPadding ProgressBar[Enabled].backgroundPainter ProgressBar[Enabled].foregroundPainter

。 4. 也许对你来说最简单的方法是从Nimbus defaults 的顶部更改nimbusOrange,但是这种更改无处不在,

以更改 Control Color 的方式输出到 GUI 的有趣输出,例如

UIManager.getLookAndFeelDefaults().put("nimbusOrange", (new Color(127, 255, 191)));

。 5.例如

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import javax.swing.*;

public class MyPopupWithNimbus {

    public MyPopupWithNimbus() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        JList list = new JList();
        panel.add(list);
        JProgressBar progress = new JProgressBar();
        progress.setStringPainted(true);
        progress.setString("60 pct");
        progress.setValue(60);
        frame.add(panel);
        frame.add(progress, BorderLayout.SOUTH);
        JPopupMenu menu = new JPopupMenu();
        menu.add(new JMenuItem("A"));
        menu.add(new JMenuItem("B"));
        menu.add(new JMenuItem("C"));
        JMenu jmenu = new JMenu("D");
        jmenu.add(new JMenuItem("E"));
        menu.add(jmenu);
        frame.setVisible(true);
        menu.show(frame, 50, 50);
    }

    public static void main(String[] args) {

        try {
            for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(laf.getName())) {
                    UIManager.setLookAndFeel(laf.getClassName());
                    UIManager.getLookAndFeelDefaults().put("nimbusOrange", (new Color(127, 255, 191)));
                    UIManager.getLookAndFeelDefaults().put("PopupMenu[Enabled].backgroundPainter",
                            new FillPainter(Color.ORANGE));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                MyPopupWithNimbus aa = new MyPopupWithNimbus();
            }
        });
    }
}

class FillPainter implements Painter<JComponent> {

    private final Color color;

    FillPainter(Color c) {
        color = c;
    }

    @Override
    public void paint(Graphics2D g, JComponent object, int width, int height) {
        g.setColor(color);
        g.fillRect(0, 0, width - 1, height - 1);
    }
}

【讨论】:

  • 是Netbeans的一个项目,如何发布整个项目?
  • 补充 mKorbel 的答案,看看这里:docs.oracle.com/javase/tutorial/uiswing/lookandfeel/…
  • 谢谢,现在可以使用了。我已经编辑了主要帖子,添加了解决方案和一个新问题:D
  • 是可能的,但你必须放在那里 GradientPaint 或者最困难的方法是从 Nimbus Painter 获取颜色数组,这些值是 JComponents 的不同 JComponents,我建议更改控制颜色,但是对整个 Nimbus GUI 有影响,您是否尝试仅更改橙色,然后尝试一些非活动背景?你的 GUI 会很好,所有的 JComponents 都会有相同的颜色主题:-),更好,最安全,最简单的方法 :-),祝你好运
  • @mKorbel... 是的!直接更改基色非常快速:D
【解决方案2】:

这是我在我目前开发的应用程序中所做的

ColorUIResource colorResource = new ColorUIResource(Color.red.darker().darker());
UIManager.put("nimbusOrange",colorResource);

这只是将默认的橙色更改为更吸引人的颜色,并且它会随处更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多