Java 使用keyListener中断递归函数?

Java 使用keyListener中断递归函数?,java,function,recursion,Java,Function,Recursion,我已尝试在视图类中安装一些KeyListener来终止此方法。但这种方法似乎不会停止。我不确定如何真正阻止它执行?该按钮似乎在整个方法执行过程中一直被按下 public void method1() { try { robot = new Robot(); Compare.captureScreen(800, 550, 200, 50); if (Compare.processImage("image.png") == true) {

我已尝试在视图类中安装一些KeyListener来终止此方法。但这种方法似乎不会停止。我不确定如何真正阻止它执行?该按钮似乎在整个方法执行过程中一直被按下

 public void method1() {

    try {
        robot = new Robot();
        Compare.captureScreen(800, 550, 200, 50);
        if (Compare.processImage("image.png") == true) {
            robot.mouseMove(890, 576);
            robot.mousePress(InputEvent.BUTTON1_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_MASK);
        } else if (Compare.processImage("image.png") != true) {
            if (Compare.file.exists()) {
                Compare.file.delete();
            }
            robot.delay(2000);
            method1();

        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}
我试过这样的方法:

JButton btnNewButton = new JButton("method1");
    btnNewButton.setFocusable(true);
    btnNewButton.requestFocus();
    btnNewButton.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
                System.exit(0);
            }
        }
    });
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            theModel.method1();
        }
    });
    btnNewButton.setBounds(163, 113, 101, 23);
    mainPanel.add(btnNewButton);

您正在调用Swing事件调度线程(EDT)上的长时间运行的代码,完全占用该线程并使Swing无响应。这里的解决方案是让您的长时间运行的代码在EDT下运行,并在后台线程中运行。

您可能按下和释放键太快了。我通常使用
rob.setAutoDelay(150)每当我模拟GUI输入时。如果没有自动延迟,
机器人
不会处理钥匙释放事件。我希望我知道为什么。也许有人可以解释一下。这个评论是离题的。。。但是像
expr==true
expr!=真的
@AustinD:这与此无关。他正在用长时间运行的代码绑定Swing事件线程。@HovercraftFullOfEels所以事实上他使用的是
robot.delay(2000)
?@AustinD:是的,他也可以使用Swing计时器来完成这个任务,这可以解决问题。@AndersLassen:请看一看。它将告诉您有关EDT的所有信息,以及捆绑它如何冻结GUI。您可以创建并使用任何线程来从事件线程中获取代码,但更好的解决方案可能是使用SwingWorker,上面链接的教程将详细介绍这一点。谢谢,我会尝试一下。