进度条设计

  • 观其效果
  • IprogressView
  • progressView


之前在资源接收端出现的processView,也就是进度条。在此进行展示代码以及出现的效果,其实虽说不是什么关键点,但其中牵扯到了多线程的问题。
因为对于我们接收端来说,一个发送端对应一个线程进行接收,那么对于一个文件的写操作,存在多个线程对一个文件的不同位置进行写的操作,那对于进度条的显示,当然是每一个文件对应一个进度条,并且采用一个bar对象来作为锁,因为对于多个线程写同一进度条来说,必须要顺序执行,后一个线程写的过程需要参照之前写完的位置进行续写。

观其效果

IprogressView

public interface IprogressView {//只需要让用户使用//1.需要根据提供的进度条个数,来生成相应个数的进度条//2.需要完成的方法是,根据提供的显示长度,和总共需要显示的长度,进行显示,若拥有多个进度条的话,应该对应显示void paintProgressView(List<String> fileList, String appName);//需要将需要进度条的对象与精度条进行绑定void changeProgress(String oneBar, int perValue, int perAllLength);//通过给定的对象显示对应进度条的内容}

progressView

对进度条接口的实现类。

public class progressView implements IprogressView, baseView {private JFrame mainFream;private JLabel jlbCount;private JButton jbtClose;private Map<String, JProgressBar> jproMap;//根据对象所对应的进度条private volatile int count;private String JFrameName;private JPanel center;public progressView() {count = 0;}
/*
*整体进度条的界面布局
*/public void initalizeView() {//size 表示的是进度条的个数,同样对应文件的个数int size = jproMap.size();int height = size * 100 + 75;mainFream = new JFrame(JFrameName);mainFream.setSize(700, height);mainFream.setLayout(new BorderLayout());//主框采用流失布局mainFream.setLocationRelativeTo(null);mainFream.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);mainFream.setResizable(false);mainFream.add(new JLabel("      "), BorderLayout.WEST); mainFream.add(new JLabel("       "), BorderLayout.EAST);JPanel Jpldown = new JPanel(); Jpldown.setLayout(new BorderLayout());mainFream.add(Jpldown, BorderLayout.SOUTH);JLabel up = new JLabel(" ");up.setFont(baseView.buttonFont);Jpldown.add(up, BorderLayout.NORTH);JLabel down = new JLabel(" ");down.setFont(baseView.buttonFont);Jpldown.add(down, BorderLayout.SOUTH);JPanel centers = new JPanel();centers.setLayout(new BorderLayout());Jpldown.add(centers, BorderLayout.CENTER);JPanel downwest = new JPanel();downwest.setLayout(new BorderLayout());centers.add(downwest, BorderLayout.WEST);downwest.add(new JLabel("         "), BorderLayout.WEST);JPanel downEast = new JPanel();downEast.setLayout(new BorderLayout());centers.add(downEast, BorderLayout.EAST);downEast.add(new JLabel("         "), BorderLayout.EAST);jbtClose = new JButton();jbtClose.setText("关闭");jbtClose.setEnabled(false);jbtClose.setFont(baseView.buttonFont);jbtClose.setBackground(baseView.proBackground);downEast.add(jbtClose, BorderLayout.CENTER);jlbCount = new JLabel();jlbCount.setFont(baseView.buttonFont);jlbCount.setText("成功传输" + count + "个文件");downwest.add(jlbCount, BorderLayout.CENTER);center = new JPanel();center.setLayout(new GridLayout(size, 1));mainFream.add(center, BorderLayout.CENTER);}/**根据文件的的名称生成对应文件的进度条框*/@Overridepublic void paintProgressView(List<String> object, String appname) {//生成一个界面this.JFrameName = appname;jproMap = new HashMap<String, JProgressBar>();if(object.isEmpty()) {return;}else {for(String obj : object) {JProgressBar temp = new JProgressBar();temp.setValue(0);temp.invalidate();temp.setForeground(baseView.pro);temp.setFont(baseView.buttonFont);Border b = new LineBorder(baseView.proBorder);temp.setBorder(BorderFactory.createLoweredBevelBorder());temp.setStringPainted(true);//TODO在这里设置进度条的格式jproMap.put(obj, temp);               }}initalizeView();for(String one : jproMap.keySet()) {JPanel temp = new JPanel();JLabel jlb = new JLabel(one);jlb.setFont(baseView.progress);JProgressBar jpbprogress = jproMap.get(one);temp.setLayout(new BorderLayout());temp.add(jlb, BorderLayout.NORTH);temp.add(jpbprogress, BorderLayout.CENTER);//每个jpanel装一个进度条;center.add(temp);//}    }public void showView() {mainFream.setVisible(true);dealAction();}/**添加每个进度条的侦听事件,当进度条写完时,显示传输文件的个数*/public void dealAction() {for(JProgressBar one : jproMap.values()) {one.addChangeListener(new ChangeListener() {@Overridepublic void stateChanged(ChangeEvent e) {if(one.getValue() == 100) {synchronized (this) {jlbCount.setText("成功传输" + (++count) + "个文件");}                 if(count == jproMap.size()) {                          jbtClose.setEnabled(true);}}}});}jbtClose.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {closeView();}});}public void closeView() {mainFream.dispose();}//对于不同的线程来说,要是访问的是同一个进度条那需要同步执行//对于不同的线程来说,要访问不同的进度条是并形执行,互不影响,//当然对于一个线程来说,不管是同一个还是不同个进度条,只能顺序执行private void changeView(JProgressBar jpbprogress, int value, int allLenth) {//不管传进来的总值是多少,根据的都是比例进行写入,最终写入进度条的值都是100int per = (int) (value / (double) allLenth * 100.0) + 1;jpbprogress.setValue(per);}@Overridepublic void changeProgress(String object, int value, int allLenth) {if(object == null) {return;}JProgressBar jpbMatch = this.jproMap.get(object);//如果没有锁的情况下,每个线程需要写自己的部分,那就需要获取到当前已经写的部分,在根据自己当前写的部分加以计算synchronized (jpbMatch) {  int count = jpbMatch.getValue();count  = (int) ((double)count / 100 * allLenth);for (int i = 0; i <= value; i++) {try {         changeView(jpbMatch, count + i, allLenth);} catch (InterruptedException e) {e.printStackTrace();}}            }        }}

多文件自平衡云传输 (六)番外篇 —————— 开开开山怪相关推荐

  1. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

    转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...

  2. 【梅哥的Ring0湿润插入教程】【番外篇四】抓取盛大GPK驱动保护文件及简略逆向...

    [梅哥的Ring0湿润插入教程] Email:mlkui@163.com 转载请注明出处,谢绝喷子记者等,如引起各类不适请自觉滚J8蛋! 番外篇四:抓取盛大GPK驱动保护文件及简略逆向 [湿润前言] ...

  3. python爬虫进程和线程_python爬虫番外篇(一)进程,线程的初步了解-阿里云开发者社区...

    整理这番外篇的原因是希望能够让爬虫的朋友更加理解这块内容,因为爬虫爬取数据可能很简单,但是如何高效持久的爬,利用进程,线程,以及异步IO,其实很多人和我一样,故整理此系列番外篇 一.进程 程序并不能单 ...

  4. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    前言   去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...

  5. 『中级篇』docker之wordpress容器SSL(番外篇)(78)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之wordpress容器SSL(番外篇)(78) 搞了2天终于搞定了,现在分享给大家. apache2 ...

  6. Soul网关源码阅读番外篇(一) HTTP参数请求错误

    Soul网关源码阅读番外篇(一) HTTP参数请求错误 共同作者:石立 萧 * 简介     在Soul网关2.2.1版本源码阅读中,遇到了HTTP请求加上参数返回404的错误,此篇文章基于此进行探索 ...

  7. IO多路复用(番外篇)、poll、epoll三者的区别

    Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本 ...

  8. 【JS 逆向百例】吾爱破解2022春节解题领红包之番外篇 Web 中级题解

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 逆向目标 本次逆向的目标来源于吾爱破解 2022 春节解题领红包之番外篇 Web 中级题,吾爱破解每年都会有派送红包活动(送吾爱 ...

  9. 神经网络学习小记录-番外篇——常见问题汇总

    神经网络学习小记录-番外篇--常见问题汇总 前言 问题汇总 1.下载问题 a.代码下载 b. 权值下载 c. 数据集下载 2.环境配置问题 a.20系列所用的环境 b.30系列显卡环境配置 c.CPU ...

  10. yolov5使用2080ti显卡训练是一种什么样的体验我通过vscode搭建linux服务器对python-yolov5-4.0项目进行训练,零基础小白都能看得懂的教程。>>>>>>>>>第二章番外篇

    第二章番外篇:yolov5通过vscode搭建linux服务器对python-yolov5-4.0项目进行训练,零基础小白都能看得懂的教程.YOLOv5搭建的最快搭建方式,踩坑经历详谈 前期准备: 2 ...

最新文章

  1. TensorFlow基础10-(误差反向传播算法以及实现多层神经网络)
  2. opencv检测黑色区域
  3. 机器学习笔记:非负矩阵分解问题 NMF
  4. 随便写点时间相关的模块
  5. VTK:Utilities之BoundingBox
  6. POJ - 3294 Life Forms(二分+后缀数组)
  7. python库Camelot从pdf抽取表格数据以及python库camelot安装及使用中的一些注意事项
  8. 2017sc 膜你赛9 比赛笔记
  9. androidpn的学习研究(三)androidpn-server服务端几个类说明
  10. jQuery-$(document).ready和$(window).load有什么区别?
  11. Java 数组转字符串
  12. oracle 10g管理地址,oracle10g管理共享服务器
  13. MySql 集群/主从
  14. 串行口实验 编写程序利用串口调试助手通过串口给实验板发送数据(数据范围0x00-0xfe),单片机将接受到的数据加1后再发送给PC机。
  15. librosa 音频处理库
  16. 数学基础篇 有理数(一)
  17. 计算机考研金工,我的金工跨考经验
  18. Python3编写炸金花游戏--超详细的讲解!!
  19. Bumped!【最短路】(神坑
  20. 一次完整的HTPPS请求

热门文章

  1. 插件化框架集成-360插件框架DroidPlug
  2. Java打造RPC框架(四):支持zookeeper与负载均衡
  3. 计算机一级常用计算公式,软考网络工程师常用计算公式汇总1
  4. 数据分析EXCEL入门必备
  5. 第7章,广义相加模型(GAMs)
  6. 在命令行使用 Pandoc 进行文件转换
  7. 大家好!欢迎来到YANG先森博客......
  8. C1任务01 植物大战僵尸存档修改
  9. xxx科技有限公司_公司管理制度
  10. 陈佩斯曾受邀喜剧综艺:被酬劳吓的恍惚好几天