2013-05-17 114 views
0

你好,我想用Swing Worker類的幫助來更新我的JProgress Bar。我在這個論壇上搜索了關於這個主題的其他問題,並拿了一些解決方案的代碼,但在我的情況下,我不工作:(我有兩個類:在第一個類中,我創建Swing工人類BitmapFilterParralelGrey的對象與此代碼:JProgress Bar not updating

Greyscale.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent evt) { 



       int numThreads = Runtime.getRuntime().availableProcessors(); 
       int HeightPerThread = image.getHeight()/numThreads; 
       BitmapFilterParallelGrey[] bitmapFilter = new BitmapFilterParallelGrey[numThreads]; 
       int startRow = 0, endRow = 0; 
       for (int i = 0; i < numThreads; ++i) { 
        startRow = i * HeightPerThread; 
        endRow = startRow + HeightPerThread; 
        bitmapFilter[i] = new BitmapFilterParallelGrey(image, 
          startRow, endRow); 

        bitmapFilter[i].addPropertyChangeListener(new PropertyChangeListener() { 

          @Override 
          public void propertyChange(PropertyChangeEvent e) { 
           if ("progress".equals(e.getPropertyName())) { 
            BitmapViewer.ProgressBar.setIndeterminate(false); 
            BitmapViewer.ProgressBar.setValue((Integer) e.getNewValue()); 

           } 
          } 
         }); 
        bitmapFilter[i].execute(); 

       } 


       for (int i = 0; i < numThreads; i++) { 
        try { 
         bitmapFilter[i].get(); 
        } catch (ExecutionException | InterruptedException e) { 
         e.printStackTrace(); 
       } 
        } 


       showImage(); 

     } 
    }); 

如SwingWorker類的執行應被擰i。在環路創建多個對象以我第二類BitmapFilterParallelGrey I濾波器在doInBackground(的圖像),並設置ProgressValue的代碼:。

public class BitmapFilterParallelGrey extends SwingWorker<Void, Void> { 
BufferedImage image; 
private int startRow, endRow; 


public BitmapFilterParallelGrey(BufferedImage image, int startRow, int endRow){ 
    this.image = image; 
    this.startRow= startRow; 
    this.endRow= endRow; 

    } 
@Override 
public Void doInBackground() throws Exception { 

    int width = image.getWidth(); 

    for(int i=startRow; i<endRow; i++) 
    { 
     for(int j=0; j<width; j++) 
     { 

     //Filter image 

} 
     setProgress(i/100); 

     Thread.sleep(10); 

    } 
    return null; 
} 


} 

問題是進度條在過濾完成時更新(100%)。爲什麼不更新它吃了,而它在後臺過濾? 謝謝!

回答

0

我能想到一些可能會給你帶來有趣結果的原因。其中一個原因可能與你的throws Exception {有關。你有沒有嘗試檢查,看看是否有任何例外,你還沒有發現?我對Java仍然很陌生,在過去的幾周裏我只是編寫自己的工作,所以我仍然不熟悉Java可以自行解決的問題以及不能解決的問題。還有其他一些可以做到的事情。

setProgress(int value);

假設你的進度條是0和100之間的值,或許是解決在setProgress方法的百分比。因此,像:

setProgress((int)((100*(i - startRow))/(endRow - startRow)));

或者,也許你應該嘗試投int這樣setProgress((int)(i/100));

也許,它工作在100%的唯一原因是,這是點I/100等號一個整數。

而且,這可能是微不足道的,但是當我把我的進度條的新的價值,我做到了,像這樣:BitmapViewer.ProgressBar.setValue(bitmapFiller[i].getProgress());

最後一個原因,我能想到的就是的的確代碼執行的如此之快,只捕獲在PropertyChange被解僱的最後一次PropertyChange

從手冊:

因爲是的PropertyChangeListeners在事件指派線程多次調用異步通知setProgress方法被調用了任意PropertyChangeListener之前可能發生。爲了達到性能目的,所有這些調用僅與最後一個調用參數合併爲一個調用。

我希望我已經理解你的代碼足夠有幫助。