目录
进度条在我们日常使用的软件中已经很频繁了,不过除了安装或更新软件,一般都是在网页中才会看到。本文就想分享一下,如何用Java代码实现进度条加载的效果。
Swing 可以用来做一些页面的加载进度条还是很不错的,起到美观的作用,其中的配置也可可以根据自身需求调整。


代码:
- import javax.swing.*;
- import java.awt.*;
-
- /**
- * 加载进度条
- */
- public class StartLoadingView extends JWindow implements Runnable {
-
- /*** 定义加载窗口大小*/
- public static final int LOAD_WIDTH = 1075;// 页面宽度
- public static final int LOAD_HEIGHT = 604;// 页面高度
-
- /*** 获取屏幕窗口大小*/
- public static final int WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width;
- public static final int HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height;
-
- /*** 定义进度条组件*/
- public JProgressBar progressbar;
-
- /*** 定义标签组件*/
- public JLabel label;
-
- // 构造函数
- public StartLoadingView() {
-
- // 创建标签,并在标签上放置一张背景图
- label = new JLabel(new ImageIcon("C:\\Users\\admin\\Desktop\\java.jpg"));// 这里放页面要展示的背景图
- label.setBounds(0, 0, LOAD_WIDTH, LOAD_HEIGHT - 15);
- // 创建进度条
- progressbar = new JProgressBar();
- // 显示当前进度值信息
- progressbar.setStringPainted(true);
- // 设置进度条边框不显示
- progressbar.setBorderPainted(false);
- // 设置进度条已加载的背景色
- progressbar.setForeground(new Color(210, 0, 80, 255));
- // 设置进度条未加载的背景色
- progressbar.setBackground(new Color(188, 190, 194));
- progressbar.setBounds(0, LOAD_HEIGHT - 15, LOAD_WIDTH, 15);
- // 添加组件
- this.add(label);
- this.add(progressbar);
- // 设置布局为空
- this.setLayout(null);
- // 设置窗口初始位置
- this.setLocation((WIDTH - LOAD_WIDTH) / 2, (HEIGHT - LOAD_HEIGHT) / 2);
- // 设置窗口大小
- this.setSize(LOAD_WIDTH, LOAD_HEIGHT);
- // 设置窗口显示
- this.setVisible(true);
- }
-
- public static void main(String[] args) {
- StartLoadingView t = new StartLoadingView();
- new Thread(t).start();
- }
-
- @Override
- public void run() {
- for (int i = 0; i <= 100; i++) {
- try {
- // 加载进度条需要用到多少秒,20就是2秒
- Thread.sleep(20);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- progressbar.setValue(i);
- }
- JOptionPane.showMessageDialog(this, "程序加载成功");
- this.dispose();
- // 如果这里不继续执行代码,将关闭本次运行
- }
-
- }


- public static void main(String[] args) {
- char incomplete = '░'; // U+2591 Unicode Character 表示还没有完成的部分
- char complete = '█'; // U+2588 Unicode Character 表示已经完成的部分
- int total = 100;
- StringBuilder builder = new StringBuilder();
- Stream.generate(() -> incomplete).limit(total).forEach(builder::append);
- for (int i = 0; i < total; i++) {
- builder.replace(i, i + 1, String.valueOf(complete));
- String progressBar = "\r" + builder;
- String percent = " " + (i + 1) + "%";
- System.out.print(progressBar + percent);
- try {
- // 这里为了表示越到后面越慢的场景,所以这里的sleep不是一个固定的数值。
- Thread.sleep(i * 5L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
1.首先通过Stream.generate(),创建未完成的部分,这里用 StringBuilder 来创建字符串对象,通过 append 方式来填充,如下:Stream.generate(() -> incomplete).limit(total).forEach(builder::append);
2.将 total设置成 100,限制一下长度。再通过一个 for 循环来不断的替换未完成中的部分,将字符挨个替换为完成的字符,builder.replace(i, i + 1, String.valueOf(complete))。
PS.这里有三个需要需要的地方:
- 进度条始终展示在一行,并没有换号,所以我们要用 System.out.print() 方法输出,不能用 System.out.println(); 方法来输出;如果我们直接通过System.out.print(); 输出的话,会发现虽然在同一行出现,但是会越来越长,每次循环的字符串会接在后面,这样是不行的。所以这里我们需要使用到回车符号,大家都知道\r\n,用来回车和换行,其实这种两个符号\r 是回车,\n 是换行。回车是将光标移动到行首,换行则是将光标移动的下一行
- 进度条会根据网络和资源包大小下载的时候慢慢变化的,所以我们要有一定的速度,不能一下子就完成了,这里我们可以简单通过 Thread.sleep() 来实现;
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。