JProgressBar使用小问题

IT_xinxiu 2010-04-13 11:14:53
本人最近编写一个下载网络资源的程序,在文本框输入URL,然后点击“下载”按钮就触发以下事件,我在每次把缓冲区的内容写入文件后,都获得当前已下载文件的大小,并让他与总文件大小作比较,从而求出百分比。然后再通过setValue(),设置进度条的进度。可是进度条就是没反应,请高手指点。(还有一个附加问题,如果有两个事件触发源,当一个事件触发运行,还没结束时,另一个事件又被触发,如何使这两个被触发的事件同时运行。)
private javax.swing.JButton Bxiazai;
private javax.swing.JLabel JL1;
private javax.swing.JLabel JL2;
private javax.swing.JProgressBar PB;//= new javax.swing.JProgressBar();
private javax.swing.JTextField T1;
//Timer timer=new Timer(100,this);
public long fileLength;
File file;
long length=0;
JL1 = new javax.swing.JLabel();
T1 = new javax.swing.JTextField();
Bxiazai = new javax.swing.JButton();
PB = new javax.swing.JProgressBar();
JL2 = new javax.swing.JLabel();
PB.setMinimum(0);
PB.setMaximum(100);
PB.setOrientation(JProgressBar.HORIZONTAL);
PB.setValue(0);
PB.setStringPainted(true);
PB.setBorderPainted(true);
PB.setBackground(Color.pink);

public void actionPerformed(ActionEvent e) {

if(e.getSource()==Bxiazai) {
//PB.setValue(60);
// timer.start();
urlString=T1.getText();

URL url2;
try {
url2 = new URL(urlString);

FileOutputStream fos = null;
BufferedInputStream bis = null;
HttpURLConnection httpurl = null;

byte[] buf = new byte[1024];
int size = 0;

// 建立链接

httpurl = (HttpURLConnection) url2.openConnection();
// 连接指定的资源
httpurl.connect();
// 获取网络输入流
bis = new BufferedInputStream(httpurl.getInputStream());
// 建立文件
String path=new String(url2.getPath());
String a[] = path.split("/");
fos = new FileOutputStream(a[a.length-1]);
// 保存文件

fileLength=(long)httpurl.getContentLength(); //获得要下载的网络文件的大小

while ( (size = bis.read(buf)) != -1)
{
fos.write(buf, 0, size);
File file=new File(a[a.length-1]); //获得已下载文件的大小
int i=(int)Math.floor(file.length()/fileLength*100); //获得已下载的百分比
PB.setValue(i);

}

fos.close();
bis.close();
httpurl.disconnect();

JOptionPane.showMessageDialog(this,"文件下载成功","提示", JOptionPane.INFORMATION_MESSAGE);
}
catch (IOException err) {
JOptionPane.showMessageDialog(this,"文件下载失败","提示", JOptionPane.ERROR_MESSAGE);
}



}

}
...全文
257 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT_xinxiu 2010-04-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pomelover 的回复:]
引用 8 楼 it_xinxiu 的回复:

引用 6 楼 pomelover 的回复:
不是说了嘛,你占用的cpu现在就是用来写文件呢!要……
[/Quote]这样啊,我还以为你说的是,连接,获得网络资源那里占用了CPU。是不是应该理解为,读取网络资源跟写入文件这过程不能间断,所以CPU不能去干别的事啊?
James.Ji 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 it_xinxiu 的回复:]

引用 6 楼 pomelover 的回复:
你一直在这里占用CPU下载的文件,然后就告诉他说:“给我更新一下进度条,但是不给你时间,因为我还得要你继续给我下文件呢。”你认为你的CPU有时间去更新画面么?虽然你给他传了很多次值!
还有一个问题,为什么他没时间去更新进度条,而有时间去写入文件呢?
[/Quote]不是说了嘛,你占用的cpu现在就是用来写文件呢!要不您现在用它干嘛呢?
IT_xinxiu 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pomelover 的回复:]
你一直在这里占用CPU下载的文件,然后就告诉他说:“给我更新一下进度条,但是不给你时间,因为我还得要你继续给我下文件呢。”你认为你的CPU有时间去更新画面么?虽然你给他传了很多次值!
[/Quote]还有一个问题,为什么他没时间去更新进度条,而有时间去写入文件呢?
IT_xinxiu 2010-04-14
  • 打赏
  • 举报
回复
呵呵,太感谢了,说得很生动。
James.Ji 2010-04-14
  • 打赏
  • 举报
回复
你一直在这里占用CPU下载的文件,然后就告诉他说:“给我更新一下进度条,但是不给你时间,因为我还得要你继续给我下文件呢。”你认为你的CPU有时间去更新画面么?虽然你给他传了很多次值!
IT_xinxiu 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pomelover 的回复:]
开启一个新线程控制进度条,在线程之间传递下载进度信息
[/Quote]那你能说一下,为什么这里要用多线程吗?我每次写入完一次数据就设置一次进度条的值不行吗?
James.Ji 2010-04-14
  • 打赏
  • 举报
回复
开启一个新线程控制进度条,在线程之间传递下载进度信息
IT_xinxiu 2010-04-14
  • 打赏
  • 举报
回复
我也怀疑是多线程问题,请问怎么解决
wuly505 2010-04-14
  • 打赏
  • 举报
回复
楼上正解
chenluozhi 2010-04-14
  • 打赏
  • 举报
回复
多线程

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧