2015-03-02 56 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