使用JButton停止java.awt.Robot

时间:2015-09-26 16:15:32

标签: java

所以我正在制作一个利用机器人来复制和粘贴文本的程序。然而,当涉及到如何在其动作中停止机器人时,我已经碰壁了(我更喜欢使用按钮,因为整个应用程序在GUI中)。现在我拥有它,以便创建机器人并在单击其他按钮时启动,并在一定数量的消息后停止。根据我的理解,你需要停止它的线程,但我不知道该怎么做。

public void initSpam() throws AWTException
{

    Robot bot = new Robot();
    isRunning = true;

    int delayTime;
    if(isDefault)
        delayTime = DEFAULT;
    else
        delayTime = customTime;

    StringSelection selection = new StringSelection(spam);
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(selection, selection);

    bot.delay(1250);

    for (int i = 0; i < buffer; i++) {
        bot.keyPress(KeyEvent.VK_CONTROL);
        bot.keyPress(KeyEvent.VK_V);
        bot.keyRelease(KeyEvent.VK_CONTROL);
        bot.keyRelease(KeyEvent.VK_V);
        bot.keyPress(KeyEvent.VK_ENTER);
        bot.keyRelease(KeyEvent.VK_ENTER);
        bot.delay(delayTime);
    }

}

以上是按下其他JButton时调用的方法。如果有人可以指导我如何做到这一点并解释所有这些线程如何工作/如何正确使用它(假设我不太了解),我将非常感激。 谢谢!

2 个答案:

答案 0 :(得分:1)

Thread workThread=new Thread(new Runnable() {
    @Override
    public void run() {
        //WORK initspam here
    }
});

停止工作,点击通话:

workThread.interrupt();

在initSpam中添加:

   for (..) {
      if (Thread.interrupted()) {
          break;
      }
   }

答案 1 :(得分:1)

如果您需要继续执行一系列重复操作,javax.swing.Timer即可:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.Timer;

public class Main {
    private static final Timer timer = new Timer(1000, Main::run);

    public static void main(final String[] args) {
        final JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());
        frame.setMinimumSize(new Dimension(200, 200));

        final JButton startButton = new JButton("start");
        startButton.addActionListener(e -> timer.start());
        frame.add(startButton);

        final JButton stopButton = new JButton("stop");
        stopButton.addActionListener(e -> timer.stop());
        frame.add(stopButton);

        frame.setVisible(true);
    }

    private static void run(final ActionEvent e) {
        System.out.println("do stuff");
    }
}

您不应该致电sleepdelay,否则他们会让您的按钮无法响应。延迟应仅由Timer对象控制。

如果您的操作更复杂,并且您需要在随机位置进行睡眠/延迟,则创建新线程可能更容易:

private static Thread thread;

public static void main(final String[] args) {

    ...

    startButton.addActionListener(e -> {
        thread = new Thread(Main::run);
        thread.start();
    });
    stopButton.addActionListener(e -> thread.interrupt());
}

private static void run() {
    try {
        while (true) {
            Thread.sleep(1000);
            System.out.println("do stuff");
        }
    } catch (final InterruptedException e) {
        return;
    }
}

每次从工作线程调用Thread.sleep时,如果主线程中断它,它将抛出InterruptedException

请记住,您无法与新线程中的大多数AWT组件进行交互。即使您想要更改标签上的文字,也必须通过SwingUtilities.invokeAndWait进行更改。您也不应该在这些线程之间共享任何可变状态 - 除非正确同步。坚持第一个选项,即使它稍微使你的代码复杂化 - 不必处理线程通常是值得的。