JList 中显示保管箱列表文件后如何停止 SwingWorker?

How to stop SwingWorker once dropbox list files are displayed in JList?

我有一个 JList,它显示保管箱帐户 (Dropbox API v2) 中的文件列表。

文件列表使用 swingworker 工作,但是,我可以在任务完成后自动停止或取消 swingworker。

我试过 -> 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 的不同网页和 Whosebug 上发布的问题,但无法解决这个问题。也许我实现编码的方式有问题,它无法停止。

非常感谢您的帮助

完成后,您不必取消它。 让它 return 从 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 Running" 标志(参见 JavaDoc )会导致工作程序被中断(字面意思)。所以只需将它设置为 false 并且循环将 运行 下一次检查 isCancelled.