Java制作进度条

【效果图】

【描述】

进度条宽度保持和窗口宽度一致,进度最小值为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();
    }
}

【说明】

上诉代码保留了之前测试的一些代码,已注释。

你可能感兴趣的:(Java,java,swing)