调试UI并在按下键时暂停

hal*_*tan 6 java debugging intellij-idea

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

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

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

问题:当我按下Esc我当前正在调试的UI程序时,无论在哪里,最简单的Java调试器是什么?

*这不完全正确,但为了一般解决方案,我想以这种方式来考虑它.

Mat*_*nry 3

正如本问题中所讨论的,您可以创建自己的子类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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

然后,当您遇到该断点时,您可以单步执行super.postEvent()调用并查看调​​用的位置、哪个组件接收它以及它们何时开始与代码的某些部分进行交互。不过,请预先警告,这可能是一个漫长的过程——AWT/Swing 事件调度可能会变得相当复杂。