我真的不是调试专家,最近我遇到了一个问题,希望有一个简单的解决方案。当我测试和调试Mathematica plugin for IDEA时,我会编写一些代码,构建它并在沙盒IDEA中运行它。
对于那些不熟悉为IDEA编写插件的人:主要问题是,所有的UI代码已经存在,因为它带有IDEA。我的插件只实现了使IDEA理解Mathematica语言所需的特定接口。因此,设置断点或抛出@Jeroen建议的onClickListener
之类的东西是不可能的,因为我几乎没有编写任何单行的UI代码*。
现在我遇到了一切正常的情况,但是当我取消特定的动作时,会发生一些奇怪的事情。我不知道当我按 Esc 取消此操作时,调用哪个特定方法(不是我的!)。目前的观点很可能深入到IDEA的源代码中,我可以使用调试器进行导航!
问题:在我目前正在调试的UI程序中按 Esc 时,Java中最容易使调试器中断的方法是什么?< / p>
*这不完全正确,但为了一般解决方案,我想这样想。
答案 0 :(得分:3)
正如this question中所讨论的,您可以创建自己的EventQueue
子类来检查事件,并在代码中创建一个位置,您可以在其中设置断点并仅捕获某些类型的事件。它可能看起来像这样:
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new EventQueue(){
public void postEvent(AWTEvent theEvent) {
if(theEvent instanceof KeyEvent){
KeyEvent kEvent = (KeyEvent)theEvent;
if(kEvent.getKeyCode() == KeyEvent.VK_ESCAPE){
System.out.println("escape pressed, set breakpoint here");
}
}
super.postEvent(theEvent);
}
});
然后,当您点击该断点时,您可以进入super.postEvent()
调用并查看它的去向,哪些组件接收它,以及它们何时开始与您的代码的某些部分进行交互。事先警告说,这可能是一个漫长的过程 - AWT / Swing事件调度会变得非常复杂。
答案 1 :(得分:1)
如果您正在(或可以移植到)Netbeans,您可以使用专为这些以GUI为中心的问题而设计的visual debugger。当您与GUI元素交互时,它可以引导您访问特定的源代码,因此它应该能够指向您单击转义时运行的神秘代码。我相信其他IDE具有类似的功能,但Netbeans是我所知道的唯一一个不受欢迎的IDE。