2015-09-26 20 views
0

停止java.awt.Robot中的所以我在做一个程序,它利用机器人来复制和粘贴文本。然而,当谈到如何在动作中间停止机器人时,我遇到了困难(因为整个应用程序都在GUI中,我更喜欢使用按钮)。现在我拥有它,这样Robot就可以创建并且在点击不同的按钮时启动,并且在一定数量的消息之后停止。从我所了解的你需要停止它的线程,但我不知道如何做到这一点。有一个JButton

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时调用的方法。如果有人能指导我如何做到这一点,并解释所有这些线程如何工作/如何正确使用它(假设我不太了解),我将不胜感激。 谢谢!在initSpam

workThread.interrupt(); 

补充:

回答

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来完成该操作。您也不应该在这些线程之间共享任何可变状态 - 除非正确同步。坚持第一个选项,即使它稍微复杂了你的代码 - 不必处理线程通常是值得的。

+0

第一套完美的作品!这使得现在更有意义,所以谢谢你。你知道任何可以阅读关于线程的地方吗?我猜如果我更好地理解它们,它可能会帮助我找出不使用它们的地方和位置(如果需要)。 – finaris

+1

[Oracle教程](https://docs.oracle.com/javase/tutorial/essential/concurrency/threads.html)可能是一个好的开始。 –

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

停止工作,在点击通话

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