我正在为一个游戏创建一个程序,在每一次点击之间的Y时间内,随机间隔点击X秒。下面是执行此操作的代码。
try {
Util.autoCode rand = new Util.autoCode();
Robot robot = new Robot();
int NoC;
NoC = Integer.parseInt(this.numberOfClicksTF.getText().trim());
if (NoC == 0) {
while (NoC == 0) {
// robot.mousePress(InputEvent.BUTTON1_MASK);
System.out.println("Infinite Press");
Thread.sleep(rand.clickDelay());
System.out.println("Infinite Release");
// robot.mouseRelease(InputEvent.BUTTON1_MASK);
Thread.sleep(rand.interval());
break;
}
} else {
for (int i = 0; i < NoC; i++) {
//robot.mousePress(InputEvent.BUTTON1_MASK);
System.out.println("Click Press");
Thread.sleep(rand.clickDelay());
System.out.println("Click Release");
// robot.mouseRelease(InputEvent.BUTTON1_MASK);
Thread.sleep(rand.interval());
}
}
} catch (AWTException ex) {
Logger.getLogger(MainFrame.class
.getName()).log(Level.SEVERE, null, ex);
} catch (NumberFormatException ex) {
Logger.getLogger(MainFrame.class
.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
}我注释掉了鼠标的按压和发布,这样我就可以做一个检查,以确保时间是正确的,并且它将执行每次点击。此代码由JButton在JFrame中启动。每当我按下“开始”按钮,它就会启动代码,只要在Netbeans中强行关闭它,就会停止它。目标是让一个开始按钮启动,一个停止按钮中断代码,但不关闭JFrame。我到处都找遍了,一直找不到一个直接的答案。
欢迎并感谢任何帮助!
发布于 2017-08-23 17:12:42
您需要使用SwingWorker,例如:
在您的JFrame中,您可能有一个SwingWorker和它的“生成器”方法:
private SwingWorker worker;
private SwingWorker getWorker() {
worker = worker == null ? worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
while (true) {
System.out.println("doInBackground!");
Thread.sleep(1000);
}
}
} : worker;
return worker;
}现在,在swing主线程(用于可视化组件更新)中,您需要使用后台任务调用SwingWorker:
private void jButtonActionPerformed(java.awt.event.ActionEvent evt) {
if (getWorker().getState().equals(SwingWorker.StateValue.STARTED)) {
worker.cancel(true);
worker = null;
} else {
getWorker().execute();
}
} 您可以随意点击该按钮多次,该应用程序将创建并运行a SwingWorker,也可以将其设置为空当前SwingWorker。
发布于 2017-08-23 17:17:56
这周真的遇到了同样的问题,试图制造出几乎相同的东西。首先,让我建议用Java阅读多线程。这看起来可能很复杂,但相信我,有必要理解为什么您的程序不能工作。(我将简要介绍一下下面发生的事情)
本质上,您的GUI运行在一个需要与您的机器人分离的事件调度程序线程上。这是因为当调用thread.sleep()时,本质上也会让GUI线程休眠,从而导致GUI控件的丢失。在单独的线程中启动您的机器人和GUI,并让您的JButtons调用方法使您的机器人线程启动和停止。例如:
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new GUI();
}
});
}要创建GUI (我不知道GUI是什么样的,所以我只是编写了新的GUI()来代替您的GUI),这样它就在它应该在的线程中了。然后,在您的eventListener中,每次按下“开始”按钮,就会生成一个新的线程来保存机器人对象:
if(actionEvent.getSource().equals(playButton)) { //listening for the play button
if(robotThread == null) {
autoClicker= new AutoClicker();
Thread = new Thread(autoClicker);
Thread.start();
}
}并像以前一样在autoClicker()类中启动机器人对象,并让autoClicker实现runnable。
public class AutoClicker implements Runnable{
private Robot robot;
public void run(){
try {
robot = new Robot();
} catch (AWTException e) {e.printStackTrace();}
//you need to learn about synchronization first
while(true){
synchronized(this){
//do clicks and stuff here
}
}
}
}这样,您的GUI和机器人就在单独的线程中。为了使JButtons启动并停止您的机器人,您需要学习同步,以了解如何正确地执行多线程。
另一件事是,您可能应该使用wait()方法而不是lot ()方法,因为should ()会导致更多的问题,而这些问题在一个单一的答案中是无法解决的。同样,您需要首先学习并发/同步。
如果你想下面的评论,我们可以想出一个方法,我的代码,我现在正在处理,这是完全相同的事情,你想要做的。我可以向你解释其中的每一个部分,以便在路上帮助你。
https://stackoverflow.com/questions/45844989
复制相似问题