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
.
我有一个 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
.