2011-11-24 38 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

相关问题