Java 使用keyListener中断递归函数?
我已尝试在视图类中安装一些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) {
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,上面链接的教程将详细介绍这一点。谢谢,我会尝试一下。