Robot类,mouseMove在无限循环中

时间:2014-09-15 00:21:57

标签: java swing awtrobot

我有一个我想要的jbutton,只要它被一个机器人类点击一个mouseMove的无限循环。然后,再次单击时停止。当我第一次按下它时,问题出在我的代码中,它导致系统冻结,当我再次单击它时没有任何反应。我用:

boolean go = false

  jb.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            go = !go;
            if (go)
                jb.setText("Stop!");
            else
                jb.setText("Start!");
            try {
                Robot robot = new Robot();
                while (go) {
                    robot.mouseMove(500, 500);
                    robot.delay(1000);
                    robot.mouseMove(500, 400);
                }
            } catch (AWTException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    });

1 个答案:

答案 0 :(得分:2)

Swing是一个单线程环境。这意味着如果有任何东西阻止这个线程,Swing将无法响应新事件,包括绘制请求,并且看起来你的UI已被冻结......因为它有... ...

查看Concurrency in Swing

最简单的解决方案可能是生成一个新线程并在其中运行循环...

首先写一篇关于你想要完成的工作的Runnable ......

public class MouseRunner implements Runnable {

    @Override
    public void run() {
        try {
            Robot robot = new Robot();
            while (go) {
                robot.mouseMove(500, 500);
                robot.delay(1000);
                robot.mouseMove(500, 400);
            }
        } catch (AWTException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}

然后,当用户首次点击该按钮时,创建一个Thread并启动它......

jb.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        go = !go;
        if (go) {
            jb.setText("Stop!");
            Thread t = new Thread(new MouseRunner());
            t.start();
        } else {
            jb.setText("Start!");
        }
    }
});

请注意,您的go变量可能需要volatile