2015-03-02 60 views
0

我还在建设一个程序来测试图像。为了更新图形用户界面,我制作了一个摆动工具,他工作得很好,直到我点击101个选定文件的魔法数量。
我需要一个目录来测试几百个图像和不希望他们sperate每101个图像块。那么有没有人有一个想法,为什么它停止工作,没有激活完成的方法?
为了使它更清楚:
测试图1,测试图2,....测试Img X(x < = 100),测试Img 101停止,不测试或完成或错误图102(只是不进行)只有消息我可以发现,PropertyChangeEvent在101个测试图像后点击“完成”。但该属性仍然应该改变,progressBar显示99%,popUp显示101/102。 (测试数字,直到100都工作正常,并显示在结束100%和100/100,而我的日志得到消息“完成”!的Java SwingWorker的停止在工作的PropertyChangeListener在100

我更新此工作者,是一个progressBar和popUp与当前%(进度条)和当前图像(eg101/110)
这里的的SwingWorker本身:

private void work(final File filex) 
{ 


    worker = new SwingWorker<Void, Integer>() 
    { 
     @Override 
     protected Void doInBackground() throws Exception     
     { 
      File file = filex; 

      if (file.isDirectory()) 
      { 

       File[] listOfFiles = file.listFiles(); 
       iMax=listOfFiles.length; 
       for (i= 0; i< iMax; i++) 
       { 
        aktionenTest(listOfFiles[i]);         //processing/working here 
        setProgress(i); 
       } 
       setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 

      } 
      else 
      { 
       iMax = 1; 
       i = 1; 
       aktionenTest(file);              
       setProgress(i); 
      } 



      return null; 


     } 

     @Override 
     protected void process(List<Integer> chunks) 
     { 

     } 

     @Override 
     protected void done() 
     { 
      if(worker.isCancelled()) 
      { 
       log.append("Cancelled!"); 
       setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
      } 
      else 
      { 
       log.append("DONE"); 

      } 
     } 

    }; 
    worker.addPropertyChangeListener(new PropertyChangeListener() { 

     @Override 
     public void propertyChange(PropertyChangeEvent event) { 
      System.err.println(event); 
      log.append(""+event+newline); 
      if(event.getPropertyName().trim().equals("progress")) 
      { 
       if(event.getOldValue().equals(0)) 
       { 
        popupCounter((Integer) event.getNewValue()); 
       } 
       if(iMax == 1) 
       { 
        maxProg = iMax; 
        curProg = ((Integer) event.getNewValue())*100/maxProg; 

        progressBar.setValue(curProg);  
        popupUpdate((Integer) event.getNewValue()); 
       } 
       else 
       { 
        maxProg = iMax; 
        curProg = (((Integer) event.getNewValue()+1))*100/maxProg; 

        progressBar.setValue(curProg);  
        popupUpdate((Integer) event.getNewValue()); 
       } 
      } 


     } 
    }); 

    worker.execute(); 
} 

这里的PropertyEvent的前101

java.beans.PropertyChangeEvent[propertyName=progress; oldValue=99; newValue=100; propagationId=null; [email protected]] 

和101之后(输出但仍有图102离开)

java.beans.PropertyChangeEvent[propertyName=state; oldValue=STARTED; newValue=DONE; propagationId=null; [email protected]] 

那么,有人有什么想法是什么问题?也许我对我自己的代码有太多的代码来找到它。

问候和感谢
Zorian

+1

哪里是在代码“DONE”?在这个for循环中,你正在增加“o”而不是“i”,无论是什么。 'for(i = 0; i DSquare 2015-03-02 16:05:33

+0

SRY我拼写错误,而将来自我用的,因为他们在上下文中有意义的隐秘变量的代码,但在片段和英语的原因是没有意义不是我的自然语言(我改变了它的片断;)) – Zorian 2015-03-02 16:16:16

回答

1

当你调用setProgress(i)与我> 100它抛出

new IllegalArgumentException("the value should be from 0 to 100"); 

你可以用的东西代替它像setProgress(i*100/iMax)

唯一的例外是没有抓到,只是导致线程异常停止。

+0

呀,我找不到一个异常,但问题是,我不能在setProgress中使用这个操作,因为它只接受'int',当我投它时,有四舍五入,然后计数器不适合下面100 – Zorian 2015-03-02 16:24:51

+0

@Zorian编辑了我的答案。这应该会更好。 – Dia 2015-03-02 16:27:09

+0

感谢,它的工作,但现在我有问题,我不得不重写我的事业弹出它显示了100/103 103时完成也是进度现在的89,而9个文件,从9的值被progessed – Zorian 2015-03-02 16:34:05