首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JButton中断循环

用JButton中断循环
EN

Stack Overflow用户
提问于 2017-08-23 16:28:10
回答 2查看 836关注 0票数 0

我正在为一个游戏创建一个程序,在每一次点击之间的Y时间内,随机间隔点击X秒。下面是执行此操作的代码。

代码语言:javascript
复制
    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。我到处都找遍了,一直找不到一个直接的答案。

欢迎并感谢任何帮助!

EN

回答 2

Stack Overflow用户

发布于 2017-08-23 17:12:42

您需要使用SwingWorker,例如:

在您的JFrame中,您可能有一个SwingWorker和它的“生成器”方法:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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。

票数 0
EN

Stack Overflow用户

发布于 2017-08-23 17:17:56

这周真的遇到了同样的问题,试图制造出几乎相同的东西。首先,让我建议用Java阅读多线程。这看起来可能很复杂,但相信我,有必要理解为什么您的程序不能工作。(我将简要介绍一下下面发生的事情)

本质上,您的GUI运行在一个需要与您的机器人分离的事件调度程序线程上。这是因为当调用thread.sleep()时,本质上也会让GUI线程休眠,从而导致GUI控件的丢失。在单独的线程中启动您的机器人和GUI,并让您的JButtons调用方法使您的机器人线程启动和停止。例如:

代码语言:javascript
复制
public static void main(String[] args) {
     javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new GUI();
            }
        });

}

要创建GUI (我不知道GUI是什么样的,所以我只是编写了新的GUI()来代替您的GUI),这样它就在它应该在的线程中了。然后,在您的eventListener中,每次按下“开始”按钮,就会生成一个新的线程来保存机器人对象:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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 ()会导致更多的问题,而这些问题在一个单一的答案中是无法解决的。同样,您需要首先学习并发/同步。

如果你想下面的评论,我们可以想出一个方法,我的代码,我现在正在处理,这是完全相同的事情,你想要做的。我可以向你解释其中的每一个部分,以便在路上帮助你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45844989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档