【问题标题】:Is there a way to block the main thread until a swingworker is done? [duplicate]有没有办法阻止主线程,直到一个 swingworker 完成? [复制]
【发布时间】:2011-11-24 17:00:20
【问题描述】:

可能重复:
How do I wait for a SwingWorker's doInBackground() method?

我读到这样做真的很糟糕,但我认为这是实现目标的最佳方式...... 有没有办法阻塞主线程,直到下例中的 swing worker 完成?

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

}

提前致谢

【问题讨论】:

标签: java multithreading swing swingworker


【解决方案1】:

正如我所提到的,在 Swing EDT 期间永远不要使用 Thread#sleep(int),GUI 简单冻结直到 Thread#sleep(int) 结束,更多在 Concurency in Swing,关于冻结的示例 here

您有三个(可能是四个)选项如何在某个时期更新 GUI 或每次延迟某些执行

将所有here 放在一起(加上java.util.Timer 将执行包装到invokeLater

【讨论】:

  • 谢谢。使用摆动计时器可以强制它仅在计时器停止运行后退出该方法吗?
  • @Josh 我认为是的,但是(很抱歉)当我看到您的帖子时,请将您关于 Timer 的想法/问题发布为 Java 代码,然后大多数读者可以回答... .,只需编辑您的问题并添加新代码,例如 javax.swing.Timer 和 SwingWorker stackoverflow.com/q/6186188/714968
【解决方案2】:

如果你想阻止,那么不要使用摇摆工人,只要这样做

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

在美国东部时间。 SwingWorker 的全部目的是阻塞 EDT。

如果您只想以特定间隔更改组件的颜色(即闪烁组件),那么javax.swing.Timer 可能更合适。

【讨论】:

  • 我忘了注意你的回答,从来没有,从来没有建议阻止 EDT 作为 newbee 的答案,如果对 Swing 的 EDT 没有最深入的了解,这种方式可能是通往地狱的道路,请删除这些文字和代码
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
相关资源
最近更新 更多