2012-03-18 58 views
0

我想显示使用jprogressbar将文件从一个文件夹复制到另一个文件夹的进度。我所做的所有事情,但j进度栏在最后运行,并在最后显示100%。 我是初学者,以这种形式阅读主题,说我应该使用EDT,但仍然没有得到所有的东西。我也做了另一个线程来更新Jprogress栏,但没有任何事情发生。我的代码部分
Jdialog框中Jprgbarbar不更新

 jProgressBar1.setMinimum(0); 
     jProgressBar1.setMaximum(100); 
     try 
     { 
      fis = new FileInputStream(read); 
      BufferedInputStream bins = new BufferedInputStream(fis); 
      int b; 
      long copied_data=0; 
      for(int i =0;i<no_of_parts;i++) 
      { 
       copied_data = 0; 
       fos = new FileOutputStream(jTextField2.getText()+"\\"+reading_file_name+".part"+i); 
       bouts = new BufferedOutputStream(fos); 
       while((b = bins.read())!= -1) 
       { 
        bouts.write(b); 
        percentage = (progress*100)/file_size; 
        jProgressBar1.setValue(percentage); 
        copied_data++; 
        progress++; 

        if(copied_data==each_part_size_in_byte) 
        { 
         bouts.flush(); 
         bouts.close(); 
         break; 
        } 
       } 
       bouts.flush(); 
       bouts.close(); 

      } 

     }catch(Exception e){} 
+0

不,不,你没有把我错了,我只是需要一些建议 – 2012-03-18 16:23:57

+0

它的工作,实际上JprogressBar没有更新,它显示100%在最后,所以我只是希望它应该实时运行,谢谢我的任务完成。 – 2012-03-18 16:53:18

回答

3

,更新进度条应该不是同一个线程文件复制操作上运行的代码。您需要文件复制操作在单独的线程和Swing计时器上运行以查询复制任务的进度并定期更新EDT上的进度条。您目前正在执行EDT上的所有操作,这会阻止进度条更新,因为您在操作进行时正在锁定事件线程。您应该只使用EDT来更新Swing组件,其他所有内容都应该在其他线程中运行。

+0

我改变了我的代码,我把所有的文件复制操作放在其他线程中,只有进度条在actionPerfromed方法上,仍然进度条在最后更新 – 2012-03-18 16:27:09

+0

你如何在线程之间传递进度?您需要确保EDT看到进度更新。您可以同步或标记百分比变量volatile。 – nicktalbot 2012-03-21 20:47:39