我的swingworker线程出了点问题,问题出在我取消的时候。实际上,我有一个start按钮,当单击它时,它将运行我的swingworker。
从这里开始,我的swing worker做了一些小事情,但主要的事情是它完成了一些长时间运行的反射调用。
我还有一个取消按钮--你可能已经猜到了,它会取消我的swingworker。然而,问题是我有一个bug,我就是找不到它。
在第一次运行中途取消应用程序后,swing工作线程完全取消了,但是,如果我再次单击start并让它在完成时一直运行-线程似乎从我第一次运行时取消的地方恢复过来:/。我不知道为什么会这样,它看起来好像被取消的线程正在恢复并且实际上正在记住状态。我知道这是因为在我的gui上,我有一个JLabel,上面写着“正在处理15个元素中的1个...”它会跳回到被取消的点。
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
}
}发布于 2012-03-13 23:03:29
我发现我实际上并没有正确地捕获和处理异常。因此,方案流在本应停止的地方仍在继续。
发布于 2012-03-13 20:44:33
Swingworker被设计为只执行一次,你可以看看下面的post How cancel the execution of a SwingWorker?
这可能会解决你的问题,或者你会找到答案。
https://stackoverflow.com/questions/9684024
复制相似问题