Swing:立即运行代码 vs invokeLater

3

我目前正在使用别人编写的线程控制类,它用于一个Java Swing应用程序。我有两种方法,但我对为什么会有不同的行为感到困惑。根据我所知道和阅读关于事件分派线程和Swing的内容,下面的两种方法应该没有区别。显然,这是不正确的。

//If this is the AWT Event Processing thread then run the code immediately, 
//otherwise schedule it for later processing

 public static void runWithEventThread(Runnable r)
{
    if (EventQueue.isDispatchThread())
    {
        r.run();
    }
    else
    {
        EventQueue.invokeLater(r);
    }
}


//Schedule the runnable for later processing by the AWT Event Queue
public static void runLaterWithEventThread(Runnable r)
{
    EventQueue.invokeLater(r);
}

当使用runWithEventThread()展示弹出框并更新GUI(添加新按钮/重绘)时,我发现GUI有时会出现混乱。然而,当使用runLaterWithEventThread()时,一切都很好,没有问题。
唯一的问题是,当使用runLaterWithEventThread()时,我发现当我有多个弹出窗口一个接一个地显示(在点击OK后),所有弹出窗口都会同时显示。
据我所知,这两种方法应该做的是相同的事情。请问有人能解释一下发生了什么吗?

嗨,关于“GUI有时会混乱”,“mess up”是什么意思?此外,你传递的任务需要多长时间才能运行完? - Solomon Slow
我基本上是在改变JList中项目的颜色。问题在于,部分JList被弹出屏幕的扭曲图像覆盖。这类似于程序崩溃时最小化屏幕,但有时会留下程序的扭曲图像。我传递给run的任务首先是更新Jlist,然后是弹出屏幕。 - Global Tool R
1个回答

2

如果您的第一个方法是从事件线程执行的,则它可能与第二个方法不同:如果当前有任何事件在事件线程上等待,则在使用第二种方法时,这些事件将在执行run()方法之前被处理,但如果您使用第一种方法,则您的run()方法将立即执行,并且队列中存在的任何现有事件将在您的run()方法完成后运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接