2016-08-24 38 views
0

我有一個JList,它顯示了Dropbox帳戶(Dropbox API v2)中的文件列表。如何停止SwingWorker一次dropbox列表文件顯示在JList中?

這些文件的清單使用了迴轉工,但是,一旦任務完成,我可以自動停止或取消迴轉工。

我試過 - >task.cancel(true);,但是它在列表完全加載到JList之前取消了任務。下面是我迄今爲止的編碼,我知道我非常接近,但是隻是在JList中成功加載文件名後才知道如何取消該任務。

請有人幫我解決任務,一旦它完成。

private TaskLoadFiles tLoadtask; 
    private class TaskLoadFiles extends SwingWorker<Void, String> 
    { 

     @Override 
     protected Void doInBackground() throws InterruptedException 
     { 

      while (!isCancelled()) 
      { 
       try 
       { 

        ListFolderResult resultdec = client.files().listFolder("/Data/"); 
        //model used to stored the data for display 
        DefaultListModel modelListFilesdownloaddec = new DefaultListModel(); 
        while (true) 
        { 
         for (Metadata metadata : resultdec.getEntries()) { 
          //adds the data to the model --> gets the file names 
          modelListFilesdownloaddec.addElement(metadata.getName()); 
          //displays the data from the model into the JList 
          listFilesDownloadBtndeccloud.setModel(modelListFilesdownloaddec);         
         }        
         if (!resultdec.getHasMore()) { 
          break;         
         } 
         resultdec = client.files().listFolderContinue(resultdec.getCursor());         
        } 
       } 
       catch (Exception e) 
       { 
        JOptionPane.showMessageDialog(null, "Unable to load cloud files. \nError : " + e, "Cloud Error", JOptionPane.ERROR_MESSAGE); 
       }      
      } 
      return null;     
     } 
     @Override 
     protected void done() 
     { 
      tLoadtask.cancel(true);       
     } 

     protected void process() 
     { 

     } 

    } 

我該如何解決這個問題。我已經閱讀了基於swingworker和StackOverFlow上發佈的問題的多個不同的網頁,但僅僅解決不了這個問題。也許我實施編碼的方式存在問題,它無法阻止。

非常感謝您的幫助

回答

1

您不應該在完成時取消它。 只要讓它從doInBackground返回。

你現在正在做的是

while(!cancelled){ // while #1 
    while(true){  // while #2 
     break; // out of while #2 if done 
    } 
} 

它應該更像

while(!cancelled && !done) // added a "done" flag 
{ 
    doYourStuff(); 
    done = isComplete(); 
} 

免責聲明:以上片段是有效的Java - 只是僞爲了簡潔的代碼。順便說一句:使用「mayInterruptIf正在運行」標誌(請參閱JavaDoc)導致工作人員被中斷(字面意思)。所以只需將其設置爲false,循環將運行到下一個檢查isCancelled

+0

我真的很感謝你的幫助。感謝您澄清我已經運行的問題。您提出的解決方案解決了問題。再次感謝:) :) :) – John

+0

感謝您以前的幫助。不過,我一直在遇到列表加載的問題。有時候,雲端的文件列表會立即被加載,而其他時間我需要點擊一個按鈕3或4次,然後列表纔會顯示。你能幫我解釋爲什麼會發生這種情況嗎?此外,當我需要點擊按鈕3或4次,然後我得到一個異常拋出是「java.lang.ArrayIndexOutOfBoundsException:8」。我怎樣才能解決這個問題。非常感謝您的幫助。 – John

+1

最好是打開另一個問題(你可以鏈接到這個問題作爲參考),在這個問題中你描述了問題所在,並添加堆棧跟蹤和當前代碼。所以其他人也可能會提供幫助。 – Fildor