Swing:运行 code immediately vs invokeLater
Swing: Running code immediately vs invokeLater
我目前正在使用其他人编写的线程控件 class。它用于 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);
}
在更新 GUI(新 buttons/repainting)时使用 runWithEventThread() 显示弹出窗口时,我发现 GUI 有时会乱七八糟。但是,当使用 runLaterWithEventThread() 时,一切都很好,没有问题。
唯一的问题是,当我使用 runLaterWithEventThread() 时,我发现当我有多个弹出窗口一个接一个地显示时(在单击“确定”后),所有弹出窗口都会同时显示。
据我了解,这两种方法应该做同样的事情。有人可以解释一下发生了什么吗
如果您的第一个方法是从事件线程执行的,它的行为可能与第二个方法不同:如果当前有任何事件在事件线程上等待,这些事件将在您的 运行( ) 如果你使用第二种方法,方法会被执行,但如果你使用第一种方法,你的 运行() 方法将立即执行,并且队列中的任何现有事件都将在你的 运行 之后=12=]() 方法完成。
我目前正在使用其他人编写的线程控件 class。它用于 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);
}
在更新 GUI(新 buttons/repainting)时使用 runWithEventThread() 显示弹出窗口时,我发现 GUI 有时会乱七八糟。但是,当使用 runLaterWithEventThread() 时,一切都很好,没有问题。
唯一的问题是,当我使用 runLaterWithEventThread() 时,我发现当我有多个弹出窗口一个接一个地显示时(在单击“确定”后),所有弹出窗口都会同时显示。
据我了解,这两种方法应该做同样的事情。有人可以解释一下发生了什么吗
如果您的第一个方法是从事件线程执行的,它的行为可能与第二个方法不同:如果当前有任何事件在事件线程上等待,这些事件将在您的 运行( ) 如果你使用第二种方法,方法会被执行,但如果你使用第一种方法,你的 运行() 方法将立即执行,并且队列中的任何现有事件都将在你的 运行 之后=12=]() 方法完成。