2015-09-26 22 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; 
     } 
    }