调试UI并在按下键时暂停

时间:2014-03-10 01:42:14

标签: java debugging intellij-idea

我真的不是调试专家,最近我遇到了一个问题,希望有一个简单的解决方案。当我测试和调试Mathematica plugin for IDEA时,我会编写一些代码,构建它并在沙盒IDEA中运行它。

对于那些不熟悉为IDEA编写插件的人:主要问题是,所有的UI代码已经存在,因为它带有IDEA。我的插件只实现了使IDEA理解Mathematica语言所需的特定接口。因此,设置断点或抛出@Jeroen建议的onClickListener之类的东西是不可能的,因为我几乎没有编写任何单行的UI代码*。

现在我遇到了一切正常的情况,但是当我取消特定的动作时,会发生一些奇怪的事情。我不知道当我按 Esc 取消此操作时,调用哪个特定方法(不是我的!)。目前的观点很可能深入到IDEA的源代码中,我可以使用调试器进行导航!

问题:在我目前正在调试的UI程序中按 Esc 时,Java中最容易使调试器中断的方法是什么?< / p>

*这不完全正确,但为了一般解决方案,我想这样想。

2 个答案:

答案 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。