【效果图】
【描述】
进度条宽度保持和窗口宽度一致,进度最小值为0,最大值为100,每100毫秒进度值+1,进度条中间显示进度百分比
【代码】
package test;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JFrame {
private JPanel panel;
private JProgressBar progressBar;
private int value = 0;
private static final int PROGRESS_MIN_VALUE = 0;
private static final int PROGRESS_MAX_VALUE = 100;
private static final int PROGRESS_HEIGHT = 20;
private Timer timer;
public Test() {
this.setBounds(10, 10, 300, 80);
// this.setExtendedState(JFrame.MAXIMIZED_BOTH); // 最大化
// this.setLocationRelativeTo(null);// 使窗口显示在屏幕中央
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
// panel.setBackground(new Color(228, 209, 168));
progressBar = new JProgressBar();
progressBar.setMaximum(PROGRESS_MAX_VALUE);
progressBar.setMinimum(PROGRESS_MIN_VALUE);
progressBar.setValue(value);
progressBar.setPreferredSize(getNewDimension());
// 监听窗口大小,设置进度条宽度为窗口宽度(但是对于最大化和还原窗口无效,原因未知)
this.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
int width = getWidth();
// System.out.println("componentResized...width=" + width);
progressBar.setPreferredSize(getNewDimension());
}
});
// 监听窗口最大化和还原,设置进度条宽度为窗口宽度
this.addWindowStateListener(new WindowAdapter() {
@Override
public void windowStateChanged(WindowEvent state) {
if (state.getNewState() == 1 || state.getNewState() == 7) {
// System.out.println("窗口最小化");
} else if (state.getNewState() == 0) {
// System.out.println("窗口恢复到初始状态");
progressBar.setPreferredSize(getNewDimension());
} else if (state.getNewState() == 6) {
// System.out.println("窗口最大化");
progressBar.setPreferredSize(getNewDimension());
}
}
});
// 设置进度条中间显示进度百分比
progressBar.setStringPainted(true);
// 进度条进度的颜色
progressBar.setForeground(new Color(46, 145, 228));
// 进度条背景的颜色
progressBar.setBackground(new Color(220, 220, 220));
panel.add(progressBar);
this.add(panel);
// 定时器,每100毫秒进度值+1
timer = new Timer(100, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (value >= PROGRESS_MAX_VALUE) {
// 结束定时器
timer.stop();
// System.out.println("------------value=" + value);
} else {
// 设置进度值
value++;
progressBar.setValue(value);
// System.out.println("actionPerformed...value=" + value);
}
}
});
timer.start();
this.setVisible(true);
}
public Dimension getNewDimension() {
return new Dimension(this.getWidth(), PROGRESS_HEIGHT);
}
public static void main(String[] args) {
new Test();
}
}
【说明】
上诉代码保留了之前测试的一些代码,已注释。