Java - 在机器人运行时'杀死'机器人

时间:2014-05-08 19:51:46

标签: java swing jframe

我有一个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();
    }
}
}

我对程序没有终止和关闭的原因感到困惑。如何解决这个问题?

2 个答案:

答案 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);