Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 机器人类,无限循环中的鼠标移动_Java_Swing_Awtrobot - Fatal编程技术网

Java 机器人类,无限循环中的鼠标移动

Java 机器人类,无限循环中的鼠标移动,java,swing,awtrobot,Java,Swing,Awtrobot,我有一个我想要的jbutton,只要它被一个机器人类点击以生成一个鼠标移动的无限循环。然后,在再次单击时停止。问题是在我的代码中,当我第一次按下它时,它会导致系统冻结,当我再次单击它时,不会发生任何事情。我使用: boolean go = false jb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { go = !go;

我有一个我想要的jbutton,只要它被一个机器人类点击以生成一个鼠标移动的无限循环。然后,在再次单击时停止。问题是在我的代码中,当我第一次按下它时,它会导致系统冻结,当我再次单击它时,不会发生任何事情。我使用:

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();
            }
        }
    });

Swing是一个单线程环境。这意味着,如果有任何东西阻塞了该线程,Swing将无法响应新事件,包括绘制请求,并且您的UI似乎已冻结…因为它已

看看

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

首先编写一个
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();
        }
    }
}
然后,当用户第一次单击按钮时,创建一个
线程
,然后启动它

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

从查看