Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JProgressBar动态更改条颜色_Java_Swing_Jprogressbar_Nimbus_Uimanager - Fatal编程技术网

Java JProgressBar动态更改条颜色

Java JProgressBar动态更改条颜色,java,swing,jprogressbar,nimbus,uimanager,Java,Swing,Jprogressbar,Nimbus,Uimanager,我正在使用JProgressBar组件和Nimbus UI默认值。问题是,当我想手动更改每个progressbar的条形图颜色时,我通过设置JProgressBar.setUI()函数使用BasicProgressBarUI。这会带来更多麻烦,因为我只想更改条的颜色,而我似乎失去了jprogressbar的默认外观(Border,backgroundcolor) 因此,我可以在代码初始化时设置Nimbus ProgressBar的UIDefaults。它起作用了 但我想动态更改每个progres

我正在使用
JProgressBar
组件和Nimbus UI默认值。问题是,当我想手动更改每个progressbar的条形图颜色时,我通过设置
JProgressBar.setUI()
函数使用
BasicProgressBarUI
。这会带来更多麻烦,因为我只想更改条的颜色,而我似乎失去了jprogressbar的默认外观(Border,backgroundcolor)

因此,我可以在代码初始化时设置Nimbus ProgressBar的
UIDefaults
。它起作用了

但我想动态更改每个progressbar的条颜色

是否有其他方法可以更改
JProgressBar
的条形图颜色

public class ProgressGenerator extends JFrame {

    protected int minValue = 0;
    protected int maxValue = 100;
    protected int counter = 0;
    protected JProgressBar progressBar;

    public ProgressGenerator() {
        super("JProgressBar Demo");
        setSize(300, 100);

        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (InstantiationException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (UnsupportedLookAndFeelException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        progressBar = new JProgressBar();
        progressBar.setMinimum(minValue);
        progressBar.setMaximum(maxValue);
        progressBar.setStringPainted(true);

        progressBar.setForeground(Color.GREEN);

        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 ProgressGenerator();
    }
}
公共类ProgressGenerator扩展JFrame{
受保护的int最小值=0;
受保护的int最大值=100;
受保护整数计数器=0;
受保护的JProgressBar progressBar;
公共发电机(){
超级(“JProgressBar演示”);
设置大小(300100);
试一试{
UIManager.setLookAndFeel(“com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel”);
}捕获(ClassNotFoundException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}捕获(实例化异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}捕获(IllegalacessException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}捕获(不受支持的LookandFeelException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
progressBar=新的JProgressBar();
progressBar.setMinimum(最小值);
progressBar.setMaximum(最大值);
progressBar.SetStringPaint(真);
progressBar.setForeground(颜色为绿色);
JButton start=新JButton(“start”);
start.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
线程运行器=新线程(){
公开募捐{
计数器=最小值;

而(counterNimbus支持每个组件蒙皮,如其他QA中已经回答的。应用于JProgressBar“bar”意味着使用自定义foregroundPainter配置实例,如:

progressBar = new JProgressBar();

UIDefaults defaults = new UIDefaults();
Painter painter = new MyPainter(Color.GREEN);
defaults.put("ProgressBar[Enabled].foregroundPainter", painter);
defaults.put("ProgressBar[Enabled+Finished].foregroundPainter", painter);

progressBar.putClientProperty("Nimbus.Overrides.InheritDefaults", Boolean.TRUE);
progressBar.putClientProperty("Nimbus.Overrides", defaults);
最丑的画家应该是:

public static class MyPainter extends AbstractRegionPainter {

    private Color fillColor;
    public MyPainter(Color color) {
        // as a slight visual improvement, make the color transparent
        // to at least see the background gradient
        // the default progressBarPainter does it as well (plus a bit more)
        fillColor = new Color(
                color.getRed(), color.getGreen(), color.getBlue(), 156);
    }

    @Override
    protected void doPaint(Graphics2D g, JComponent c, int width,
            int height, Object[] extendedCacheKeys) {
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, width, height);
    }

    @Override
    protected PaintContext getPaintContext() {
        return null;
    }

}

为了让它看起来更美观,请查看ProgressBarPainter:它是包私有的,所以除了了解它是如何实现渐变/路径绘制并在自定义实现中执行相同的操作之外,您别无选择。

+1以Kelopatra为第一名

下面是我举的一个例子:

JProgressBar颜色最初通过以下方式设置:

UIDefaults defaults = new UIDefaults();
defaults.put("ProgressBar[Enabled].foregroundPainter", new MyPainter(Color.GREEN));
defaults.put("ProgressBar[Enabled+Finished].foregroundPainter", new MyPainter(Color.GREEN));

progressBar.putClientProperty("Nimbus.Overrides.InheritDefaults", Boolean.TRUE);
progressBar.putClientProperty("Nimbus.Overrides", defaults);
进度达到50%时,颜色将变为红色:

if (progressBar.getValue() == 50) {//change color on 50%
   UIDefaults defaults = new UIDefaults();
   defaults.put("ProgressBar[Enabled].foregroundPainter", new MyPainter(Color.RED));
   defaults.put("ProgressBar[Enabled+Finished].foregroundPainter", new MyPainter(Color.RED));
   progressBar.putClientProperty("Nimbus.Overrides.InheritDefaults", Boolean.TRUE);
   progressBar.putClientProperty("Nimbus.Overrides", defaults);                          
}
Test.java:

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;

public class Test {

    public static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JProgressBar progressBar = new JProgressBar();
        progressBar.setStringPainted(true);
        progressBar.setValue(0);
        progressBar.setBorderPainted(false);

        JButton startButton = new JButton("Start");

        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                UIDefaults defaults = new UIDefaults();
                defaults.put("ProgressBar[Enabled].foregroundPainter", new MyPainter(Color.GREEN));
                defaults.put("ProgressBar[Enabled+Finished].foregroundPainter", new MyPainter(Color.GREEN));

                progressBar.putClientProperty("Nimbus.Overrides.InheritDefaults", Boolean.TRUE);
                progressBar.putClientProperty("Nimbus.Overrides", defaults);

                SwingWorker worker = new SwingWorker() {
                    int current = 0, lengthOfTask = 100;

                    @Override
                    public Void doInBackground() {
                        while (current <= lengthOfTask && !isCancelled()) {

                            try { // dummy task
                                Thread.sleep(50);
                            } catch (InterruptedException ie) {
                            }

                            setProgress(100 * current / lengthOfTask);
                            current++;
                        }
                        return null;
                    }
                };
                worker.addPropertyChangeListener(new PropertyChangeListener() {
                    @Override
                    public void propertyChange(PropertyChangeEvent pce) {

                        String strPropertyName = pce.getPropertyName();
                        if ("progress".equals(strPropertyName)) {
                            int progress = (Integer) pce.getNewValue();
                            progressBar.setValue(progress);

                            if (progressBar.getValue() == 50) {//change color on 50%
                                UIDefaults defaults = new UIDefaults();
                                defaults.put("ProgressBar[Enabled].foregroundPainter", new MyPainter(Color.RED));
                                defaults.put("ProgressBar[Enabled+Finished].foregroundPainter", new MyPainter(Color.RED));

                                progressBar.putClientProperty("Nimbus.Overrides.InheritDefaults", Boolean.TRUE);
                                progressBar.putClientProperty("Nimbus.Overrides", defaults);
                            }

                        }
                    }
                });
                worker.execute();
            }
        });

        JPanel holder = new JPanel();
        holder.add(progressBar);
        holder.add(startButton);

        frame.add(holder);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }
                createAndShowGUI();
            }
        });
    }
}

class MyPainter implements Painter<JProgressBar> {

    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);
    }
}

导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.event.*;
导入java.beans。*;
导入javax.swing.*;
公开课考试{
公共静态void createAndShowGUI(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
最终JProgressBar progressBar=新JProgressBar();
progressBar.SetStringPaint(真);
progressBar.setValue(0);
progressBar.com(假);
JButton startButton=新JButton(“开始”);
addActionListener(新ActionListener()){
@凌驾
已执行的公共无效行动(行动事件ae){
UIDefaults=新的UIDefaults();
defaults.put(“ProgressBar[Enabled].foregroundPainter”,新的MyPainter(Color.GREEN));
defaults.put(“ProgressBar[Enabled+Finished].foregroundPainter”,新的MyPainter(Color.GREEN));
progressBar.putClientProperty(“Nimbus.Overrides.InheritDefaults”,Boolean.TRUE);
progressBar.putClientProperty(“Nimbus.Overrides”,默认值);
SwingWorker worker=新SwingWorker(){
int电流=0,长度为100;
@凌驾
公共无效doInBackground(){

虽然(当前为了更好的帮助,请尽快发布一个简短的、可运行的、可编译的、否则必须搜索的帖子,google可以返回类似的问题/答案,显示如何使用
UIDefaults
putClientProperty
更改单个
JProgressBar
颜色作为@DavidKroukamp链接的答案,您应该包括您在内。)r custom.我想通过progressBar.setForeground更改条形图的颜色-我想通过剪手指来赚钱:-)或者换句话说:如果我们采用了错误的方法,我们将无法获得预期的结果。重复垃圾桶-请参阅@DavidKroukamp@DavidKroukamp自定义ui通常是错误的方法(而且要做的工作要比你期望的多得多)-只有在你需要核心UI没有提供的功能时才建议使用。据我所知,这只是一个配置问题,可以在另一个线程中解决。+1别忘了“ProgressBar[Enabled+Finished]。foregroundPainter”或者它将在100%Completion+1时恢复到原始状态,以便根据值动态更改颜色,触感良好:-)@David Kroukamp这是否意味着我可以覆盖JProgressBar的setBackground和setForeground方法并应用UI默认值,对吗?@DavidKroukamp我对Painter类有疑问。progressbar中的条我希望它不超过边界区域。我尝试更改g.fillRect(0,0,宽度,高度-4);它确实会改变底部,但顶部仍然超出边界。有解决方案吗?