簡體   English   中英

swingworker恢復問題

[英]Issue with swingworker resuming

我的swingworker線程遇到了一些麻煩,問題就在於我取消了。 基本上,我有一個開始按鈕,點擊時運行我的swingworker。

從這里我的搖擺工作者做了很多小事,但主要的是它完成了一些長時間運行的反射調用。

我也有一個取消按鈕 - 你可能猜到了取消我的搖擺工。 然而問題是我有一個我無法指出的錯誤。

在第一次運行中途取消應用程序后,swing工作者完全取消,但是,如果我再次單擊start並讓它在完成時一直運行 - 該線程似乎從我取消的地方回來了首輪 :/ 。 我不知道為什么會這樣,它就像取消的線程正在恢復並實際記住狀態一樣。 我知道這種情況正在發生,因為在我的gui上我有一個JLabel,上面寫着“處理15個元素中的元素......”並且它會跳回到取消的點。

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
    }
}

Swingworker設計執行一次,您可以查看以下帖子如何取消SwingWorker的執行?

這可能會解決您的問題,或者您會找到答案。

我發現我實際上並沒有正確捕捉和處理異常。 因此,計划流程仍在繼續,應該停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM