我有一个JFrame,它上面有一个启动循环的按钮。循环让机器人点击我的屏幕等...在JFrame上,为什么按下'x'按钮,程序不会终止?按钮无缘无故。我删除了所有不相关的代码。 这可以控制机器人:
package nova;
public class Run {
public static void main(String[] args) throws Exception {
while (true) {
// move
Thread.sleep(Number.random(350, 650));
// click
Control.getPos();
Thread.sleep(Number.random(120, 340));
// move
// click
Control.getPos();
Thread.sleep(Number.random(800, 1000));
// space bar
Thread.sleep(Number.random(11500, 12900));
// move
// click
Control.getPos();
Thread.sleep(Number.random(120, 340));
// move
// click
Control.getPos();
Thread.sleep(Number.random(800, 1000));
// space bar
Thread.sleep(Number.random(11500, 12900));
}
}
}
这是JFrame:
package nova;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
public class Main extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
public Main() {
/*
* JFrame.
*/
setSize(600, 600);// Size of JFrame
setVisible(true);// Sets if its visible.
/*
* JButton.
*/
JButton startButton = new JButton("Start");// The JButton name.
add(startButton);// Add the button to the JFrame.
startButton.addActionListener(this);// Reads the action.
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
onExit();
}
});
}
private void onExit() {
System.exit(0);
}
/*
* The main method.
*/
public static void main(String[] args) {
new Main();// Reads method main()
}
/*
* What the button does.
*/
public void actionPerformed(ActionEvent e) {
// does this when the button is pressed
try {
Run.main(null);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
我对程序没有终止和关闭的原因感到困惑。如何解决这个问题?
答案 0 :(得分:2)
机器人不是GUI的一部分。它不会在Event Dispatch Thread上执行,因此关闭GUI对它没有影响。
如何解决这个问题?
在windowClosing(...)
方法中添加逻辑以停止机器人。因此,您需要以某种方式重构代码以摆脱while (true)
循环。
也许你可以创建一个ArrayList来跟踪你想要生成的所有事件。然后,您可以使用Timer来调用每个事件。然后在windowClosing()代码中停止Timer。
答案 1 :(得分:0)
为什么不只是:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
成为:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);