Yup*_*ing 4 java events swing event-dispatch-thread
我有一个用Swing实现的UI.一个组件做了一些可能需要一些时间的工作,所以我使用了SwingUtilities.invokeLater.但是,我正在阅读一些旧代码并在以下内容中找到ActionListener:
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// code X
}
});
} else {
// code X
}
Run Code Online (Sandbox Code Playgroud)
我认为它有意义,因为它与code XEDT 分开.但是,我发现它很容易出错,因为我已经使用了几次,而且两次都忘记了这else部分.
问题是:SwingUtilities.isEventDispatchThread()检查是否必要?或者我可以假设我不在EDT并且总是使用invokeLater?
非常感谢.
Yis*_*hai 14
即使您在EDT上,稍后调用也没有问题,但它肯定会改变事件的时间,所以当您在EDT时,必须确保您不依赖于此处的代码序列.话虽这么说,避免忘记else的一个简单方法是用实用程序方法包装调用:
public static void invokeInDispatchThreadIfNeeded(Runnable runnable) {
if (EventQueue.isDispatchThread()) {
runnable.run();
} else {
SwingUtilities.invokeLater(runnable);
}
}
Run Code Online (Sandbox Code Playgroud)
这样你永远不会忘记else.
此外,一般来说,你的idom重复code x是一个非常糟糕的主意,因为你后来可能会发现你必须修复或改进代码,你只能在一个地方做,在另一个地方留下一个bug.