我在使用我的搖擺器線程時遇到了一些麻煩,問題在於我取消時。基本上,我有一個開始按鈕,點擊時可以運行我的揮杆工。搖擺工恢復問題
從這裏我的揮杆工作人員做了一些小事情,但最主要的是它完成了一些長時間運行的反射調用。
我也有一個取消按鈕 - 你可能猜到取消了我的揮杆。然而,問題是我有一個我無法查明的錯誤。
在通過第一次運行中途取消應用程序之後,擺動工人完全取消,但是,如果我然後再次單擊開始,並在完成時讓它一直運行 - 線程似乎從哪裏回來了我第一次運行取消:/。我不知道爲什麼會這樣,它就像取消的線程正在恢復並實際記住狀態一樣。我知道這是因爲在我的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
}
}
邏輯看起來很腥(在runit中f.i.狀態檢查不完整,或者在工作人員完成後查詢外部類中定義的字段而不是這個) - 這可能導致在兩個不同的實例上作用 – kleopatra 2012-03-13 14:35:27