1

我正在尝试编写一个每 3 分钟移动一次鼠标的程序(以停止屏幕保护程序的启动),但我希望能够随意停止和启动它。正如您在下面看到的,我已经创建了按钮和方法,但是当您单击运行时,它会进入 while 循环,并且因为它实际上是一个无限循环,所以它不会查看您是否单击了结束按钮。

我在点击结束按钮时尝试了 system.exit(0),让结束按钮将 false 传递给方法 run(),从代码中可以看出,我在 while 循环中尝试了一个 if 语句来查看它是否会注意我的!

任何帮助将不胜感激!

代码:

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Test 
{
boolean loop;
static boolean exit;

public static void main(String[] args) throws AWTException
{
    System.out.println("before");
    makeButtons();
    System.out.println("after");
}

public static void makeButtons()
{
    JFrame jfrMain = new JFrame ("Mouse Robot");
    JPanel jplMain = new JPanel();
    final JButton run = new JButton("Run");
    final JButton end = new JButton("End");

    run.setEnabled(true);
    end.setEnabled(true);

    run.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            //run.setEnabled(false);
            //end.setEnabled(true);
            try {
                run(true);
            } catch (AWTException e1) 
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    });

    end.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            exit = true;
        }
    });

    jplMain.setLayout(new FlowLayout());
    jplMain.add(run);
    jplMain.add(end);

    jfrMain.getContentPane().add(jplMain, BorderLayout.CENTER);
    jfrMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jfrMain.pack();
    jfrMain.setVisible(true);

    }   

public static void run(boolean loop) throws AWTException
{
    Robot r2d2 = new Robot();

    while(loop)
    {

        System.out.println("1");
        Point mousePoint = MouseInfo.getPointerInfo().getLocation();
        mousePoint.translate(0, 1);
        r2d2.mouseMove(mousePoint.x, mousePoint.y);
        r2d2.delay(60000);
        //r2d2.delay(60000);
        //r2d2.delay(60000);
        System.out.println("2");
        mousePoint = MouseInfo.getPointerInfo().getLocation();
        mousePoint.translate(0, -1);
        r2d2.mouseMove(mousePoint.x, mousePoint.y);
        r2d2.delay(60000);
        //r2d2.delay(60000);
        //r2d2.delay(60000);
        System.out.println("looping");
        if (exit = true)
        {
            break;
        }
    }
}

}
4

5 回答 5

1

尝试

if (exit == true)
{
   break;
}
于 2010-09-16T07:48:51.590 回答
1

那么首先更正退出的条件,即exit == true按照第一个答案中所述进行。

其次,我认为即使这也不能解决您的问题,因为您正在由 EDT(甚至调度线程)调用的 actionPerformed 中进行无限循环,这将完全停止事件处理。因此,改为在移动鼠标的 actionPerformed 方法中启动一个新线程。保留对该线程的引用,以便您可以停止/中断线程,或者您也可以设置退出条件以停止线程。

如果您需要一个代码示例,请告诉我。

于 2010-09-16T08:46:22.387 回答
0

if (exit == true) { break; }

于 2010-09-16T07:51:06.717 回答
0

虽然我还没有尝试过,但我对这个工作有一些疑问。Java不会在不听鼠标的情况下运行,最终会成为无限循环吗?

我认为它必须是一些等效的 javascript 函数setInterval()来移动鼠标并且clearInterval()一旦按钮被点击。

于 2010-09-16T07:57:43.247 回答
0

首先要做到exit == true;

而不是使用exit = true;你可以使用loop = false.

一旦您单击结束按钮,它仍然不会在循环中停止。要在单击按钮后立即停止它,您必须使用两个不同的线程。1. 处理您的事件。2.另一个运行while循环。

在事件处理线程中,您必须维护一个while循环线程的对象,您可以通过它设置适当的值loopexit变量来停止循环。

于 2010-09-16T12:42:14.790 回答