我经常使用SwingUtilities.invokeLater()。但是,这样做会在某些情况下使调试变得困难:您看不到调用SwingUtilities.invokeLater()的代码的堆栈跟踪,因为该代码已经结束执行。
对于如何在调用SwingUtilities.invokeLater()时设置某种上下文(仅用于调试目的),以便找出引起问题的UI事件的原因,有什么建议吗?
发布于 2011-01-05 00:42:00
这里的大多数其他答案都很好,但我想添加另一个建议。如果您非常频繁地调用SwingUtilities.invokeLater,那么您可能在某些时候不必要地这样做,特别是如果调用的唯一目的是确保在事件线程上进行Swing更改。在适当的时候尝试以下操作:
if (SwingUtilities.isEventDispatchThread()) {
myRunnable.run();
} else {
SwingUtilities.invokeLater(myRunnable);
}发布于 2011-01-04 23:33:07
重写该方法,添加一个Log调用,然后调用真正的方法...注意:您必须替换对原始方法的所有调用。
您甚至可以包装runnable并添加上下文号(例如,稍后调用的调用的时间戳)。当runnable启动时,它开始打印上下文号
public static void myInvokeLater(final Runnable runnable) {
long ts = System.currentTimeMillis();
Log.info("call to invoke later, context :" + ts);
Runnable r = new Runnable() {
public void run() {
Log.info("start runnable of invokeLater with context :" + ts);
runnable.run();
}
};
SwingUtilities.invokeLater(r);
}发布于 2011-01-04 23:36:50
我倾向于用一个更高级的方法来替换“标准”的swingUtilites#invokeLater方法,可能是嵌入在某个"localUtilities“中,您可以给出要执行的代码,作为参数的源事件或它的线程安全副本(我猜您有一个源事件,不管它的类型是什么)。
https://stackoverflow.com/questions/4595321
复制相似问题