2012-09-26 89 views
0

我想要從掃描程序獲取圖像,並將它們放置在HashMap中,並且名稱按照由SwingWorker類執行的特定順序(稱爲ScanningService)執行。我想使用for循環來獲取另一個圖像,第一個完成後使用相同的設備。 scan.getImage()完成後返回掃描的圖像。 sc參數是一個掃描器對象。也許有人可以給我一個Executor或Timer的實現,因爲我的試驗沒有取得任何成果。在for循環中執行SwingWorker

for(int k=0; k<10; k++){ 
     lblMessage.setText("Scan Next Image: "); 
     scan = new ScanningService(sc); 
     scan.execute(); 
     scan.addPropertyChangeListener(new PropertyChangeListener() { 
      @Override 
      public void propertyChange(PropertyChangeEvent arg0) { 
       // TODO Auto-generated method stub 
       if(StateValue.DONE == scan.getState()){ 

        lblImagePreview.setIcon(new ImageIcon(scan.getImage())); 
        //logic for name in order of sequence 
        imageList.put<imagename, scan.getImage()); 
       } 
      } 
     }); 
    } 
+2

我可能會放環的'SwingWorker'內的,想必,你只能在掃描一個文檔時間... – MadProgrammer

+1

怎麼回事?截至目前爲止,這段代碼看起來不錯......但是,爲了確保在我們添加偵聽器之前工作人員還沒有準備好:-) – kleopatra

回答

1
  • SwingWorker被指定爲只運行一次,那麼以後你要調用一個新的實例

  • SwingWorker是不恰當的加載圖像,也沒有對一段時間

  • 已經看起來Runnable#Thread,輸出到Swing GUI必須包裝在invokeLater()

  • 的Swing GUI的所有更改都必須在EventDispatchThrea d來完成,你必須看看Concurency in Swing

+0

1)OP正在做你正在做的事情b ) 你什麼意思? c)爲什麼?一個搖擺人把所有的髒東西都抽象出來d)正確的,但這正是OP已經在做的事情(通過聽搖擺狀態的變化) – kleopatra

+0

@kleopatra我的永無止境的故事繼續... 1.'Runnable#Thread'仍然是更好的選擇,2.對於大多數包裝到invokeLater中的方法,不需要''Runnable#Thread''更安全的是使用它,3.沒有幾個代碼示例需要'SwingWorkers'方法中的'invokeLater'發佈','過程'和'完成'與邏輯描述由真正的Swing大師( - :我不包括我的人,我只貢獻者有很多帖子窮人upvoting分數:-),4.永遠不要用於生產代碼,5.爲享受或學習是'SwingWorkers'非常有用'APIs,6.爲什麼混淆OP沒有其他 – mKorbel

+0

搖頭在完全分歧......永無止境的故事確實;-)希望看到一個_required invokeLater_工人在EDT上運行的方法。 – kleopatra