在编写完进度条后,我们有时候会遇到它完全不动的情况,小伙伴们知道是什么原因吗?下面听小编为你们讲解讲解。

进度条不动可能是因为这个原因,“当应用程序在事件线程中执行长时间的操作时,会阻塞正常的AWT事件处理,因此阻止了重绘操作的发生”,即API本身就是线程不安全的。造成这个错误的原因,就是在run方法内直接写:

progressBar.setValue(jd);

最终修改示例:import java.awt.Color;

import java.awt.Dimension;

import java.awt.GridLayout;

import java.awt.Rectangle;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import javax.swing.JButton;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JProgressBar;

import javax.swing.JTextField;

public class Exp10_3 extends JFrame implements Runnable

{

boolean b = false; // 线程执行的标志

int jd = 0; // 当前进度

long sum = 0; // 当前共复制的长度

JButton button1 = new JButton("被复制");

JTextField beCyFile = new JTextField(30);

JButton button2 = new JButton("复制到");

JTextField CyToDir = new JTextField(30);

JButton Start = new JButton("开始复制");

JLabel label = new JLabel("进度");

JProgressBar progressBar = new JProgressBar();

void initUI()

{

JPanel top1 = new JPanel();

JPanel top2 = new JPanel();

JPanel end = new JPanel();

top1.add(button1);

top1.add(beCyFile);

top2.add(button2);

top2.add(CyToDir);

setLayout(new GridLayout(4, 1));

add(top1);

add(top2);

add(Start);

progressBar.setStringPainted(true); // 设置进度条上字符串可显示

progressBar.setBackground(Color.GREEN); // 设置进度条颜色

end.add(label);

end.add(progressBar);

add(end);

button1.addActionListener(new ActionListener()

{

// 将选择文件的绝对路径显示到被复制后的文本框内

@Override

public void actionPerformed(ActionEvent e)

{

JFileChooser fc = new JFileChooser();

fc.setFileHidingEnabled(false); // 显示隐藏文件

fc.setMultiSelectionEnabled(false); // 允许多选

fc.setDialogTitle("请选择要复制的文件");

if (fc.showOpenDialog(Exp10_3.this) == JFileChooser.APPROVE_OPTION)

{

beCyFile.setText(fc.getSelectedFile()

.getAbsolutePath());

CyToDir.setText(fc.getSelectedFile()

.getParent()); // 获取file文件的父目录(强大的API) 自我设定:默认复制到同一目录

}

}

});

button2.addActionListener(new ActionListener()

{

@Override

public void actionPerformed(ActionEvent e)

{

JFileChooser fc = new JFileChooser();

fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 仅仅能选择目录

fc.setDialogTitle("请选择要复制到的路径");

if (fc.showOpenDialog(Exp10_3.this) == JFileChooser.APPROVE_OPTION)

{

CyToDir.setText(fc.getSelectedFile()

.getAbsolutePath());

}

}

});

Start.addActionListener(new ActionListener()

{

@Override

public void actionPerformed(ActionEvent e)

{

jd = 0;

b = true;

try

{

String file1Path = beCyFile.getText();

File file1 = new File(beCyFile.getText()); // 被复制的文件

String file2Path = CyToDir.getText() + "\\copy" + file1.getName(); // 复制完后新文件路径名

File file2 = new File(file2Path); // 新建复制文件

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file1Path));

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file2Path));

byte[] be = new byte[1024 * 1024]; // 之前定义为b和boolean重复了 屏蔽了全局标志b

int len = bis.read(be);

long sum = 0;

long file1len = file1.length();

while (-1 != len)

{

bos.write(be, 0, len); // 一次读一个字节数组 换行也会读 不用自动换行了

bos.flush();

sum += len;

jd = (int)(sum * 1.0 / file1len * 100); // 之前没有乘1.0 且多写了一个(int) 导致jd一直是0 最后一次突变100

len = bis.read(be);

}

最后再绘一次

Dimension d = progressBar.getSize();

Rectangle rect = new Rectangle(0, 0, d.width, d.height);

progressBar.setValue(jd);

progressBar.paintImmediately(rect);

b = false;

System.out.println("b=" + b);

}

catch (IOException e1)

{

e1.printStackTrace();

}

}

});

Thread t = new Thread(this);

t.start();

pack();

setLocationRelativeTo(null);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args)

{

Exp10_3 t = new Exp10_3();

t.initUI();

}

@Override

public void run()

{

while (true)

{

if (b)

{

//progressBar.setValue(jd);//之前run内就这一行,进度条一直不刷新

Dimension d = progressBar.getSize();

Rectangle rect = new Rectangle(0, 0, d.width, d.height);

progressBar.setValue(jd);

progressBar.paintImmediately(rect);

if (jd == 100)

{

b = false;

//System.out.println("run内b=" + b);// 不能写return 此进程不能结束 一直开着

}

}

//System.out.println("我没有结束");//删了此行进度条就又不刷新了

//第一次改进  上面一行换成下面5行  即输出操作改成停顿1ms

try

{

Thread.sleep(1);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

}

以上就是本篇文章的所有内容,对于一些java常见问题及解决方法还有不懂的话就来我们网站看看吧。

推荐阅读:

java 进度条 不更新_java进度条不动怎么解决?相关推荐

  1. java 进度条 不更新_java 进度条不能刷新解决方案 (已更新一次)

    java期末考试都考完了,实验课却还没完,课程设计也还没开始做,本来打算把最后两次实验尽快做完,然后好好做课设,(我早就想写的坦克大战,过几天写好了,也肯定要整理发布出来).可却被多线程一题给坑了,题 ...

  2. java 进度条时间设置_java进度条

    练习JProgressBar结合Timer使用. 代码如下: package luojing; import java.awt.*; import java.awt.event.*; import j ...

  3. java上传大文件_Java超大文件上传解决办法

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  4. java生成unix.z压缩_JAVA压缩 解压缩zip 并解决linux下中文乱码

    1:再压缩前,要设置linux模式, 需要使用第三方ant-1.6.5.jar 如果是文件目录,则 ZipEntry zipEntry=new ZipEntry(basePath + System.g ...

  5. java的继承和访问_Java基础篇:如何解决成员的访问和继承?

    Java基础篇:如何解决成员的访问和继承? 尽管子类包括超类的所有成员,它不能访问超类中被声明成private的成员.例如,考虑下面简单的类层次结构: /* In a class hierarchy, ...

  6. java程序卡住的原因_Java程序卡住问题的解决

    最近又遇到一个奇怪的事情,一个非常简单的程序,就是web调用一下从数据库读取一批数据出来显示,程序刚开始一点问题没有,过一段时间就突然死掉了,所有的查询都没有反应. 探索+折磨: 刚开始用的办法真的叫 ...

  7. Java 数据库进度条_java进度条

    练习JProgressBar结合Timer使用. 代码如下: package luojing; import java.awt.*; import java.awt.event.*; import j ...

  8. java httpclient 进度条_SpringBoot如何实现一个实时更新的进度条的示例代码

    前言 博主近期接到一个任务,大概内容是:导入excel表格批量修改状态,期间如果发生错误则所有数据不成功,为了防止重复提交,做一个类似进度条的东东. 那么下面我会结合实际业务对这个功能进行分析和记录. ...

  9. perl 如何更新_Perl 进度条模块

    Term::ProgressBar 模块是一个可以用于生成进度条的 Perl 模块. 安装:cpan -i Term::ProgressBar 最小脚本,展示如何最快学会使用该模块: #!/usr/b ...

  10. php 做更新进度条,PHP exec()后更新Bootstrap进度条

    我使用PHP来运行一个python脚本,并且在脚本执行后需要更新一个进度条.进度条更新后,将执行另一个脚本,依此类推. 这里是我的代码如此的票价.我试图用JavaScript来实现.它没有解决 But ...

最新文章

  1. 阿里云宣布进入 Serverless 容器时代,推出弹性容器实例服务 ECI
  2. 用python爬取i春秋的课程名
  3. 【小知识】C、C++ 中const的实现机制
  4. BZOJ 1444: [Jsoi2009]有趣的游戏
  5. FreeRTOS之列表和列表项
  6. java的(PO,VO,TO,BO,DAO,POJO)解释
  7. esp8266环境搭建
  8. python列表生成器语法_python语法_列表生成器_生成器_迭代器_异常捕获
  9. php获取错误信息函数,关于php:如何获取mail()函数的错误消息?
  10. IDEA MySql之增删改查
  11. 面试精讲之面试考点及大厂真题 - 分布式专栏 06 详细说下CAP分别代表什么含义吗
  12. 移动短信回执怎么开通_微信短视频直播怎么做?
  13. 安装php项目后图片路径不对,解决织梦CMS栏目绑定二级域名后图片不显示,路径错误办法...
  14. 计算机网络(一)图解:计算机网络五层体系结构
  15. 2021金山wps校招(前端)
  16. Java项目:问卷调查系统(java+SSM+layui+JSP+Mysql)
  17. JAVA Math函数向上取整和向下取整
  18. SQLServer数据库设置主键和主键自增
  19. ResetTemplate封装
  20. 20个免费webservice接口

热门文章

  1. 快递100手机端页面抓取所有快递公司名称和代码
  2. 域名解析信息易语言代码
  3. AIML应答机器人(一)aiml简介
  4. WinRAR_5.40 绿色!!!无广告
  5. 球形天空盒php,unity3d天空盒
  6. node2vec文献出处_图表示学习入门2——Node2Vec
  7. node2vec python_论文笔记 | node2vec
  8. 2016-408-计组-有如下c语言程序段
  9. photoshop破解
  10. 人脸识别训练集/验证集/测试集