我经常使用 SwingUtilities.invokeLater()
。但是,这样做在某些情况下很难调试:您看不到名为SwingUtilities.invokeLater()
的代码的堆栈跟踪,因为该代码已经结束了其执行。
在调用SwingUtilities.invokeLater()
时,对于如何设置某种上下文(仅用于调试目的),是否有任何建议,以便您可以找出导致该UI事件的原因?
最佳答案
您可以尝试覆盖EventQueue
并为发布的事件打印stacktrace。同样在下面的示例中,将为每个发布的事件分配一个唯一的编号。当从其他invokeLater
中调用invokeLater
时,文本postEvent 9 from 7
将被打印在日志中
//将此代码放在主类中的某个位置以覆盖队列
EventQueue eventQueue = Toolkit.getDefaultToolkit()。getSystemEventQueue();
eventQueue.push(new MyEventQueue());
MyEventQueue类可能如下所示:
导入java.awt.AWTEvent;
导入java.awt.EventQueue;
导入java.awt.event.InvocationEvent;
导入java.util.WeakHashMap;
公共(public)类MyEventQueue扩展了EventQueue {
int currentNumber = 0;
WeakHashMap eventIdMap = new WeakHashMap ();
AWTEvent currentEvent = null;
protected void dispatchEvent(AWTEvent事件){
if(event instanceof InvocationEvent){
currentEvent =事件;
}
super.dispatchEvent(事件);
currentEvent = null;
}
公共(public)无效postEvent(AWTEvent事件){
if(event instanceof InvocationEvent){
currentNumber = currentNumber +1;
eventIdMap.put(event,currentNumber);
System.out.println(“postEvent” + currentNumber +“” +
(currentEvent!= null吗?“from” + eventIdMap.get(currentEvent):“”));
for(StackTraceElement element:new RuntimeException()。getStackTrace()){
System.out.println(“\t” +元素);
}
}
super.postEvent(事件);
}
}