swing快速入门(三十九)进度对话框

本文介绍了如何在Swing应用中使用计时器监控模拟耗时操作的进度,通过创建ProgressMonitor和Runnable任务来实时更新对话框进度,并在用户取消操作时优雅地停止任务。
摘要由CSDN通过智能技术生成

🎁注释很详细,直接上代码

上一篇

🧧新增内容
🧨1.模拟耗时操作
🧨2.使用计时器更新进度对话框

🎀源码:

package swing31_40;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class swing_test_37 {

    //定义一个计时器
    //为什么定义在这里而不是在使用时定义?
    //因为在new时定义会导致timer.stop();这句报错未初始化
    Timer timer;

    //初始化方法
    public void init(){
        //模拟耗时操作
        final SimulatedActivity simulatedActivity = new SimulatedActivity(100);

        //启动耗时操作线程
        final Thread targetThread= new Thread(simulatedActivity);

        //启动线程
        targetThread.start();

        //创建进度条对话框
        ProgressMonitor dialog = new ProgressMonitor(null, "等待任务完成", "已完成:", 0, simulatedActivity.getAmount());

        //设置定时器(300毫秒执行一次)
        timer = new Timer(300, new ActionListener() {
            //定时器执行事件
            @Override
            public void actionPerformed(ActionEvent e) {

                //设置对话框进度条
                dialog.setProgress(simulatedActivity.getCurrent());

                //如果进度条已完成,则停止计时器
                if (dialog.isCanceled()){

                    timer.stop();//停止计时器
                    targetThread.interrupt();//中断线程
                    System.exit(0);//退出程序

                }
            }
        });

        timer.start();//启动计时器

    }

    public static void main(String[] args) {
        //启动程序
        new swing_test_37().init();
    }

    //定义一个线程任务,模拟耗时操作
    private class SimulatedActivity implements Runnable{

        //设置内存可见
        private volatile int current = 0;
        private int amount;//总量

        //构造方法
        public SimulatedActivity(int amount) {
            this.amount = amount;
        }

        //获取当前值
        public int getCurrent() {
            return current;
        }

        //设置当前值
        public void setCurrent(int current) {
            this.current = current;
        }

        //获取总量
        public int getAmount() {
            return amount;
        }

        //设置总量
        public void setAmount(int amount) {
            this.amount = amount;
        }

        //重写run方法
        @Override
        public void run() {

            //通过循环,不断的修改current的值,模拟任务完成量
            while(current<amount){
                try {
                    //睡眠50毫秒
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    //中断异常处理
                    e.printStackTrace();
                }
                current++;//增加当前值
            }
        }
    }

}

🎗️效果演示:

在这里插入图片描述
下一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码对我眨眼睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值