Java Swing:进度条字体颜色修改

来源:互联网 发布:plc编程功能块 编辑:程序博客网 时间:2024/06/12 18:24

最近无聊想玩一玩gui,在自定义进度条时发现了一个小问题,进度条的背景颜色和前景颜色都可以使用JProgressBar本身自带的方法修改,但是前面的字体颜色却修改不了,造成修改背景颜色后字体的颜色会和背景颜色相互对冲,整个外观非常的丑陋。一开始去百度了一堆发现好像没有一个真正的解决方法。

后来去查看各种API,发现javax.swing.plaf.basic包中BasicProgressBarUI类和进度条的颜色有些关联,然后去看了下该类的源代码(位置在JRE System Library/rt.jar/javax.swing.plaf.basic/BasicProgressBarUI),里面果然发现了跟颜色有关的变量这里写图片描述
注释的意思大概是一个字体颜色是初始颜色,另一个字体颜色是进度条覆盖字体时的颜色,具体看下我的截图就知道了。

接着找下关于该变量的信息,在这个类里查找这两个变量,定位到如下部分:
这里写图片描述
再去UIManager类里面找到了一个put(Object key, Object value)方法,既然颜色从UIManager里面获取,那么颜色的修改应该也是在这里修改。尝试了一下,果然有效,下面是关键的两行代码:

        //未覆盖前的进度条颜色        UIManager.put("ProgressBar.selectionBackground",Color.RED);         //覆盖后的进度条颜色        UIManager.put("ProgressBar.selectionForeground",Color.BLACK)        

效果图片:
这里写图片描述

这里写图片描述

注意一点:这两行代码要在放在实例化JProgressBar之前,否则需要在这两行代码后面加上JProgressBar对象的repaint()方法来刷新该组件。

相关代码:

package com.hlx.JProgressBar;import java.awt.Color;import javax.swing.JProgressBar;public class MyJProgressBar extends JProgressBar{    public MyJProgressBar(){        this.setSize(300, 100);        this.setValue(100);        this.setForeground(new Color(252,221,219));        this.setBounds(249, 237, 300, 100);        this.setVisible(true);    }}
package com.hlx.JFrame;import javax.swing.JFrame;public class MyFrame extends JFrame {    public MyFrame(){        initFrame();    }    private void initFrame() {        this.setVisible(false);        this.setSize(800, 600);        this.setTitle("MyFrame");        this.setResizable(false);        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);        this.setLocationRelativeTo(null);    }}
package com.hlx.JProgressBar;import java.awt.Color;import javax.swing.UIManager;import com.hlx.JFrame.MyFrame;public class JProgressBarTest {    public static void main(String[] args) {        MyFrame frame = new MyFrame();        //未覆盖前的进度条颜色        UIManager.put("ProgressBar.selectionBackground",Color.RED);         //覆盖后的进度条颜色        UIManager.put("ProgressBar.selectionForeground",Color.BLACK);        frame.getContentPane().setLayout(null);        MyJProgressBar myproBar = new MyJProgressBar();        frame.getContentPane().add(myproBar);        frame.setVisible(true);        frame.setVisible(true);        myproBar.setStringPainted(true);          new Thread(){              public void run(){                  for(int i=0;i<=100;i++){                      try{                          Thread.sleep(100);                      }catch(InterruptedException e){                          e.printStackTrace();                      }                      myproBar.setValue(i);                  }                  myproBar.setString("升级完成!");              }          }.start();      }}
原创粉丝点击