所以我正在制作一个利用机器人来复制和粘贴文本的程序。然而,当涉及到如何在其动作中停止机器人时,我已经碰壁了(我更喜欢使用按钮,因为整个应用程序在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时调用的方法。如果有人可以指导我如何做到这一点并解释所有这些线程如何工作/如何正确使用它(假设我不太了解),我将非常感激。 谢谢!
答案 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");
}
}
您不应该致电sleep
或delay
,否则他们会让您的按钮无法响应。延迟应仅由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
进行更改。您也不应该在这些线程之间共享任何可变状态 - 除非正确同步。坚持第一个选项,即使它稍微使你的代码复杂化 - 不必处理线程通常是值得的。