You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java的JOptionPane中添加JProgressBar并实现1-100%进度模拟

在JOptionPane中添加模拟加载的JProgressBar

嘿,这需求太适合趣味游戏的场景了!要在JOptionPane里搞一个从1%跑到100%的模拟进度条其实不难,核心就是利用JOptionPane能容纳自定义Swing组件的特性,再配合后台线程更新进度——要是直接在主线程里更新,UI会直接卡死,体验就糟了。

给你贴个完整的可运行代码,关键细节都加了注释:

import javax.swing.*;

public class GameLoadingSimulator {
    public static void main(String[] args) {
        // 所有Swing UI操作必须在事件调度线程(EDT)里跑,这是规矩!
        SwingUtilities.invokeLater(() -> {
            // 1. 初始化进度条,设置范围1-100
            JProgressBar progressBar = new JProgressBar(1, 100);
            // 让进度条显示百分比文本,看着更直观
            progressBar.setStringPainted(true);
            progressBar.setValue(0);

            // 2. 把进度条塞进JOptionPane里
            JOptionPane optionPane = new JOptionPane(
                progressBar,
                JOptionPane.INFORMATION_MESSAGE,
                JOptionPane.DEFAULT_OPTION,
                null,
                new Object[]{}, // 这里可以加按钮,比如取消按钮,不过模拟加载可以先空着
                null
            );
            JDialog loadingDialog = optionPane.createDialog("正在加载游戏资源...");
            // 防止用户中途关掉加载框,游戏场景下可以根据需求改
            loadingDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
            loadingDialog.setVisible(true);

            // 3. 启动后台线程更新进度,别堵着EDT
            new Thread(() -> {
                try {
                    for (int progress = 1; progress <= 100; progress++) {
                        // 更新组件必须回到EDT线程,不然会出UI乱码或者崩溃
                        SwingUtilities.invokeLater(() -> {
                            progressBar.setValue(progress);
                            progressBar.setString(progress + "%");
                        });
                        // 模拟加载延迟,数值越小加载越快,比如50ms就是2秒跑完100%
                        Thread.sleep(50);
                    }
                    // 进度到100%就关掉对话框
                    SwingUtilities.invokeLater(loadingDialog::dispose);
                } catch (InterruptedException e) {
                    // 万一线程被打断,也顺手关掉对话框
                    SwingUtilities.invokeLater(loadingDialog::dispose);
                    Thread.currentThread().interrupt();
                }
            }).start();
        });
    }
}

几个关键细节说明:

  • EDT线程的重要性:Swing是单线程UI框架,所有组件操作必须在事件调度线程里执行,后台线程直接改组件会导致各种奇怪的UI问题,所以用SwingUtilities.invokeLater把更新操作抛给EDT。
  • 延迟调整:Thread.sleep(50)是模拟加载的等待时间,你可以根据游戏的节奏改——比如想让加载慢一点就改成100ms,快一点就改成20ms。
  • 扩展玩法:要是想让加载更有游戏感,还可以加个随机文本标签(比如“正在加载角色模型...”“正在生成地图...”),或者随机调整进度增长的速度,让加载看起来更“真实”。

内容的提问来源于stack exchange,提问作者Swize

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:53:11