首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:使用SwingUtilities.invokeLater()调试

Java:使用SwingUtilities.invokeLater()调试
EN

Stack Overflow用户
提问于 2011-01-04 23:29:34
回答 5查看 1.2K关注 0票数 5

我经常使用SwingUtilities.invokeLater()。但是,这样做会在某些情况下使调试变得困难:您看不到调用SwingUtilities.invokeLater()的代码的堆栈跟踪,因为该代码已经结束执行。

对于如何在调用SwingUtilities.invokeLater()时设置某种上下文(仅用于调试目的),以便找出引起问题的UI事件的原因,有什么建议吗?

EN

回答 5

Stack Overflow用户

发布于 2011-01-05 00:42:00

这里的大多数其他答案都很好,但我想添加另一个建议。如果您非常频繁地调用SwingUtilities.invokeLater,那么您可能在某些时候不必要地这样做,特别是如果调用的唯一目的是确保在事件线程上进行Swing更改。在适当的时候尝试以下操作:

代码语言:javascript
复制
if (SwingUtilities.isEventDispatchThread()) {
  myRunnable.run();
} else {
  SwingUtilities.invokeLater(myRunnable);
}
票数 2
EN

Stack Overflow用户

发布于 2011-01-04 23:33:07

重写该方法,添加一个Log调用,然后调用真正的方法...注意:您必须替换对原始方法的所有调用。

您甚至可以包装runnable并添加上下文号(例如,稍后调用的调用的时间戳)。当runnable启动时,它开始打印上下文号

代码语言:javascript
复制
 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);
}
票数 1
EN

Stack Overflow用户

发布于 2011-01-04 23:36:50

我倾向于用一个更高级的方法来替换“标准”的swingUtilites#invokeLater方法,可能是嵌入在某个"localUtilities“中,您可以给出要执行的代码,作为参数的源事件或它的线程安全副本(我猜您有一个源事件,不管它的类型是什么)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4595321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档