首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swingworker恢复的问题

swingworker恢复的问题
EN

Stack Overflow用户
提问于 2012-03-13 20:38:05
回答 2查看 367关注 0票数 0

我的swingworker线程出了点问题,问题出在我取消的时候。实际上,我有一个start按钮,当单击它时,它将运行我的swingworker。

从这里开始,我的swing worker做了一些小事情,但主要的事情是它完成了一些长时间运行的反射调用。

我还有一个取消按钮--你可能已经猜到了,它会取消我的swingworker。然而,问题是我有一个bug,我就是找不到它。

在第一次运行中途取消应用程序后,swing工作线程完全取消了,但是,如果我再次单击start并让它在完成时一直运行-线程似乎从我第一次运行时取消的地方恢复过来:/。我不知道为什么会这样,它看起来好像被取消的线程正在恢复并且实际上正在记住状态。我知道这是因为在我的gui上,我有一个JLabel,上面写着“正在处理15个元素中的1个...”它会跳回到被取消的点。

代码语言:javascript
复制
public class Test
{
    private SwingWorker<Object, Integer> swingworker = initiate(); 
    private void startListener()
    {
        start.addActionListener(new ActionListener ()
         {    
            public void actionPerformed(ActionEvent  e) 
            {             
                runIt();  
            }
        }); 
    }

    private void runIt()
    {
        try
        {
            if(swingworker .isDone())
                swingworker = getSwingWorker();

            swingworker.execute();
        }
        catch (HeadlessException e) { } 
        catch(Exception e){LogFileWriter.log(e);}
    }   


    private SwingWorker<Object, Integer> getSwingWorker()
    {
        return new SwingWorker<Object, Integer>() 
        {
            Object o;

             protected Object doInBackground() throws Exception 
             { 
                 //do some short calcs
                 doLongCalc();
                 return o;
             }

             protected void done()
             { 
                 if(!swingworker .isCancelled()) {} //chnage the gui values like enable / disable button } 
                 else{}//it was cancelled so stop progress bar and stuff

             }
        };   
    }

    private void cancelListener()
    {
        cancel.addActionListener(new ActionListener ()
         {    
            public void actionPerformed(ActionEvent e) 
            {

                if(swingworker.getState() == SwingWorker.StateValue.STARTED || swingworker.getState() == SwingWorker.StateValue.DONE)
                {
                    swingworker .cancel(true);
                }
            }
        }); 
    }

    private void doLongCalc()
    {
        //wrap the taks in checks for cancelled or not
        if(!swingworker.isCancelled())//do something
        if(!swingworker.isCancelled())//do something
        if(!swingworker.isCancelled())//do something
        if(!swingworker.isCancelled())//do something
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-13 23:03:29

我发现我实际上并没有正确地捕获和处理异常。因此,方案流在本应停止的地方仍在继续。

票数 0
EN

Stack Overflow用户

发布于 2012-03-13 20:44:33

Swingworker被设计为只执行一次,你可以看看下面的post How cancel the execution of a SwingWorker?

这可能会解决你的问题,或者你会找到答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9684024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档