2011-11-24 84 views
1

可能重複:
How do I wait for a SwingWorker's doInBackground() method?有沒有辦法阻止主線程,直到完成一個迴轉工作?

我讀過它真的不好的做法,這樣做,但我認爲它的最好辦法,我達到我的目的...... 是有一種方法可以阻止主線程,直到swing工作者在下面的例子中完成爲止?

public void flashNode(Node node, int noOfFlashes) { 
    GraphUpdater updater = new GraphUpdater(node, noOfFlashes); 
    updater.execute(); 
} 

SwingWorker

public class GraphUpdater extends SwingWorker<Integer, Integer> { 
    Node node; 
    int noOfFlashes; 

    public GraphUpdater(Node n, int noFlashes) { 
     node = n; 
     noOfFlashes = noFlashes; 
    } 

    @Override 
    protected Integer doInBackground() throws Exception { 
     Color origColor = node.getColor(); 
     for (int i=0; i<noOfFlashes; i++) { 
      changeNodeColor(node, Color.WHITE); 
      Thread.sleep(500); 
      changeNodeColor(node, origColor); 
      Thread.sleep(500); 
     } 

     return 1; 
    } 

} 

在此先感謝

+0

見http://stackoverflow.com/questions/4261666/how-do-i-wait -for-a-swingworkers-doinbackground-method –

+0

但是,如果您想要首先阻止主UI線程,爲什麼要使用Swingworker呢?你可以在主線程中運行代碼。 –

回答

2

正如我所說,從來沒有搖擺EDT,GUI簡單的凍結過程中使用Thread#sleep(int)直到Thread#sleep(int)目的,多在Concurency in Swing,例如約凍結here

你有三個(也許爲四個)選擇如何在一段時間更新GUI或每時間延遲一些執行(多個)

把所有在一起here(加java.util.Timer與執行包裹成invokeLater

+0

謝謝你。使用擺動計時器可以強制它只在計時器停止運行後退出方法嗎? – Josh

+0

@Josh我認爲是的,但(對不起),因爲我看到你的線程,請張貼你的想法/關於Timer翻譯成Java代碼的問題,然後大多數讀者可以回答....,只需編輯你的問題和添加新代碼,例如基於SwingWorker的javax.swing.Timer http://stackoverflow.com/q/6186188/714968 – mKorbel

1

如果你想阻止,那麼就不要使用擺動工人,只是做

changeNodeColor(node, Color.WHITE); 
Thread.sleep(500); 
changeNodeColor(node, origColor); 
Thread.sleep(500); 

上EDT。 SwingWorker的整體目的是而不是阻止EDT。

如果您只是想以某個間隔更改組件的顏色(即閃爍組件),那麼javax.swing.Timer可能更合適。

+0

publish(),Swing Timer +1 – mKorbel

+1

我忘了注意你的答案,從來沒有真的,永遠不會建議阻止EDT作爲newbee的答案,這種方式可能是對地獄之路沒有最深入的瞭解關於Swing的EDT,請刪除這些詞並代碼 – mKorbel

相關問題