Swing进度条演示(传输真实文件)

news2024/11/20 11:39:59

目录

GIF演示

 代码


 

此示例涵盖的知识点:线程、IO流、File、Swing、Listener、JFrame、JFileDialog、JOptionPane、JProgressBar、Timer

GIF演示

58db9deb466f4092afd9d07721838740.gif

 代码

package psn.exer.progress;

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.UUID;

/**
 * on 2023/3/4 21:20
 */
public class FileTrans {
    public static void main(String[] args) {
        new FileTrans().init();
    }

    public void init() {
        JFrame jf = new JFrame();
        JButton btn = new JButton("传输文件");
        FileDialog fld = new FileDialog(jf, "请选择需要传输的文件", FileDialog.LOAD);
        FileDialog fsd = new FileDialog(jf, "请选择文件保存的位置", FileDialog.SAVE);
        fld.setBounds(400, 200, 400, 300);
        fsd.setBounds(400, 200, 400, 300);
        jf.add(btn, BorderLayout.NORTH);
        btn.addActionListener(e -> {
            //暂时禁用按钮,防止多次点击按钮并进行多次文件传输,造成界面上多个进度条频繁切换
            btn.setEnabled(false);
            //开始选择文件,并将其信息传递给进度条和文件传输线程
            fld.setVisible(true);
            if (fld.getFile() == null || fld.getFile() == "") {
                JOptionPane.showConfirmDialog(jf, "请选择需要传输的文件!", "未选择文件", JOptionPane.CLOSED_OPTION);
                btn.setEnabled(true);
                return;
            }
            //选择文件保存位置,设置文件名
            JOptionPane.showConfirmDialog(jf, "请选择文件保存的位置", "提示信息", JOptionPane.CLOSED_OPTION);
            fsd.setVisible(true);
            if (fsd.getFile() == null || fsd.getFile() == "") {
                JOptionPane.showConfirmDialog(jf, "请输入文件名", "未输入文件名", JOptionPane.CLOSED_OPTION);
                btn.setEnabled(true);
                return;
            }
            //创建文件传输任务
            FileTransTask task = new FileTransTask(
                    new File(fld.getDirectory(), fld.getFile()),
                    new File(fsd.getDirectory(), fsd.getFile() + fld.getFile().substring(fld.getFile().lastIndexOf("."))),
                    1024);
            //创建进度条,设置其外观:完成部分颜色、边框、完成百分比及字体
            JProgressBar pb = new JProgressBar(JProgressBar.HORIZONTAL, 0, task.getTotal());
            pb.setForeground(new Color(73, 156, 84));
            pb.setBorderPainted(true);
            pb.setStringPainted(true);
            pb.setFont(new Font("等线", Font.ITALIC, 18));
            jf.add(pb, BorderLayout.SOUTH);
            //使进度条呈现
            jf.validate();
            //将文件传输任务交由此线程执行
            Thread ft = new Thread(task, "file-trans");
            ft.start();
            //创建定时监听线程timer,其任务是每隔1毫秒获取传输完成量,然后更新进度条的值
            Timer timer = new Timer(1, e1 -> pb.setValue(task.getFinished()));
            timer.start();
            //给进度条注册改变监听器,文件上传任务结束后,立即结束timer线程,提示用户操作成功,进度条不可见并移除进度条,开启上传按钮
            pb.addChangeListener(e2 -> {
                if (task.getFinished() >= pb.getMaximum()) {
                    timer.stop();
                    JOptionPane.showConfirmDialog(jf, "文件传输完毕!", "操作成功", JOptionPane.CLOSED_OPTION);
                    pb.setVisible(false);
                    jf.remove(pb);
                    btn.setEnabled(true);
                }
            });
        });
        //窗口基本设置
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setTitle("实现真实文件的传输");
        jf.setBounds(400, 200, 400, 300);
        jf.setVisible(true);
    }
}

class FileTransTask implements Runnable {
    private int bufferSize;//缓冲区字节数
    private int total;//文件总字节数
    private volatile int finished;//传输完成字节数
    private File originFile;//源文件
    private File destFile;//目标文件(另存为的文件)

    public int getFinished() {
        return finished;
    }

    public int getTotal() {
        return total;
    }

    /**
     * @param originFile 源文件
     * @param destFile   另存为的文件
     * @param bufferSize 文件传输缓存区大小
     */
    public FileTransTask(File originFile, File destFile, int bufferSize) {
        this.bufferSize = bufferSize;
        this.originFile = originFile;
        this.destFile = destFile;
        if (originFile != null) {
            this.total = (int) originFile.length();
        }
        finished = 0;
    }

    @Override
    public void run() {
        try {
            FileInputStream fis = new FileInputStream(this.originFile);
            FileOutputStream fos = new FileOutputStream(this.destFile);
            byte[] buf = new byte[this.bufferSize];
            //开始边读边存文件
            while (true) {
                fis.read(buf);
                if ((total - finished) <= bufferSize) {//一次就传输完毕或者分多次传输的最后一次
                    fos.write(buf, 0, total - finished);
                    finished = total;//结束传输的条件
                    break;
                } else {
                    finished += bufferSize;
                    fos.write(buf);
                }
                Thread.sleep(100);//增加文件传输耗时
            }
            fos.close();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyTorch】P1 简介

PyTorch 基础PyTorch 简介机器学习框架PyTorch 与 TensorFlow 的核心之争PyTorch生态PyTorch能做什么开发环境选择Pytorch Cuda 安装与疑难解答PyTorch 简介 2002年提出 torch 框架&#xff0c;是通用的机器学习计算框架&#xff0c;支持GPU加速运算&#xff1b; 2011年推出 to…

k-Tree(DP)

k-Tree1、问题2、思路&#xff08;DP&#xff09;3、代码1、问题 2、思路&#xff08;DP&#xff09; 这道题翻译过来就是说&#xff0c;给我们一个k叉树&#xff0c;然后每个点到子节点的边的边权从左到右依次为1到k。然后我们从根节点出发&#xff0c;向下走&#xff0c;我们…

@RequestParam和@PathVariable的用法与区别

PathVariable PathVariable 映射 URL 绑定的占位符带占位符的 URL 是 Spring3.0 新增的功能&#xff0c;该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义通过 PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中&#xff1a;URL 中的 {xxx} 占…

[vue] Vite的使用

[vue] Vite的使用环境package.json文件变更变更脚手架修改脚本命令index.html 文件htmlWebpackPlugin 替换为 vite-plugin-htmlWere sorry but vue3.x-vite-ts doesnt work properly without JavaScript enabled. Please enable it to continue.vite.config.ts 文件变更vite-pl…

设计模式之行为型模式

四、行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在…

[acwing周赛复盘] 第 93 场周赛20230304

[acwing周赛复盘] 第 93 场周赛20230304 一、本周周赛总结二、 4867. 整除数1. 题目描述2. 思路分析3. 代码实现三、 4868. 数字替换1. 题目描述2. 思路分析3. 代码实现四、4869. 异或值1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 彩笔了&#xff0c;只A…

十大经典排序算法【快速了解】

文章目录一、算法分类二、经典排序算法总览三、算法复杂度四、代码实现一、算法分类 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a; 通过比较来决定元素间的相对次序由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。 非…

电视剧《狂飙》太过诡异,主演各个悄无声息,龙套演员却身价倍增

说起电视剧《狂飙》&#xff0c;相信很多人都有过观看&#xff0c;这部以反腐为题材的大剧&#xff0c;尺度之大近年来绝无仅有。不过观众在被剧情震撼的同时&#xff0c;也发现了一些诡异的事情&#xff0c;比如说主角和配角的反差&#xff0c;让人感觉很不适应。 在电视剧《狂…

51单片机入门————数码管显示

我们在马路上看到的红绿灯&#xff0c;就是由数码管来实现的&#xff0c;就是其中可能加入了一些延时和转换数码管是通过控制138译码器与74HC245来控制数码管的亮灭与数字的显示电路原理图我们先讨论一个数码管数码管有共阳极和共阴极&#xff0c;我们现在使用的STC89C52是共阴…

DataX入门

目录 1. DataX介绍 2. DataX支持的常用数据源类型 3. 设计理念 4. DataX框架设计 4.1. Reader 4.2. Writer 4.3. Framework 5. DataX的运行流程 6. DataX与Sqoop对比 7. 部署 8. 配置详解 9. 案例 同步MySql到HDFS 9.1. 整体结构 9.2. mySqlReader 9.2.1. …

C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp()

C语言函数&#xff1a;字符串函数及模拟实现strncpy()、strncat()、strncmp() 在了解strncpy、strncat()、前&#xff0c;需要先了解strcpy()、strncat()&#xff1a; C语言函数&#xff1a;字符串函数及模拟实现strlen() 、strcpy()、 strcat()_srhqwe的博客-CSDN博客 strncp…

包装类详解(装箱,拆箱)

Object 引用可以指向任意类型的对象&#xff0c;但有例外出现了&#xff0c;8 种基本数据类型不是对象&#xff0c;那岂不是刚才的泛型机制要失效了&#xff1f;&#xff08;泛型详解._阿瞒有我良计15的博客-CSDN博客&#xff09; 实际上也确实如此&#xff0c;为了解决这个问题…

数据结构与算法-二叉树-序列化与反序列化

可能性探究:我们可以想到的是只有一棵树按照某个序是唯一确定要给结构的情况才可能被序列化和反序列化&#xff0c;比如我们对于以下的二叉树可以找到它的先序、中序、后序如下&#xff1a; 根据它的先序和后序我们找不到任何其他可能的树&#xff0c;所以可以根据先序和后序去…

NLP预训练模型

Models Corpus RoBERTa: A Robustly Optimized BERT Pretraining Approach 与BERT主要区别在于&#xff1a; large mini-batches 保持总训练tokens数一致&#xff0c;使用更大的学习率、更大的batch size&#xff0c;adam β20.98\beta_20.98β2​0.98&#xff1b;dynamic ma…

aws eks 集群初始化过程中pause容器的启动逻辑

eks集群默认策略在磁盘使用量达到threshold时会清除镜像&#xff0c;其中pause镜像也可能会被清除 https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-worker-nodes-image-cache/ pause容器能够为pod创建初始的名称空间&#xff0c;pod的内的容器共享其中的网络空…

库函数qsort 的模拟实现

在之前了解了库函数qsort的使用之后 我们来模拟实现一下上篇有介绍 qsort的底层实现是快速排序 由于害怕没有人了解过快速排序 我就用大家熟知的冒泡排序进行模拟实现 先来展示完整代码 以下代码为升序排序 如果降序将冒泡排序中的大于号改为小于号就可以了#define _CRT_SECURE…

malloc实现原理探究

2021年末面试蔚来汽车&#xff0c;面试官考察了malloc/free的实现机制。当时看过相关的文章&#xff0c;有一点印象&#xff0c;稍微说了一点东西&#xff0c;不过自己感到不满意。今天尝试研究malloc的实现细节&#xff0c;看了几篇博文&#xff0c;发现众说纷纭&#xff0c;且…

MySql启动错误(Mac系统 安装 mysql-8.0.32-macos13-arm64 后每次点击启动 无法启动) --- 已解决

MySql启动的时候: 立即变红! 查看日志如下: 2023-03-04T14:18:01.089671Z 0 [System] [MY-010910] [Server] /usr/local/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.32) MySQL Community Server - GPL. 2023-03-04T14:18:10.304169Z 0 [System] [MY-010116] [Server]…

【EDA工具使用】——VCS和Verdi的联合仿真的简单使用

目录 1.芯片开发所需的工具环境 2.编译仿真工具 3.三步式混合编译仿真&#xff08;最常用&#xff09;​编辑 4.两步式混合编译仿真​编辑 5.VCS的使用 ​6.verdi的使用 1.产生fsdb文件的两种方法​编辑 1.芯片开发所需的工具环境 2.编译仿真工具 3.三步式混合编译仿真…

按位与为零的三元组[掩码+异或的作用]

掩码异或的作用前言一、按位与为零的三元组二、统计分组1、map统计分组2、异或掩码总结参考资料前言 当a b 0时&#xff0c;我们能够很清楚的知道b是个什么值&#xff0c;b 0 - a -a&#xff0c;如果当a & b 0时&#xff0c;我们能够很清楚的知道b是什么值吗&#xf…