如何停止java swing计时器

时间:2017-01-04 06:08:11

标签: java multithreading swing timer runnable

此应用程序有2个线程,此处显示的一个线程调用一个方法,每4秒暂停一次自动点击方法(只是为了方便)进行一些鼠标移动。我想让它在你点击gui停止按钮时停止计时器。 现在当你点击停止然后重新开始它然后有两个定时器将执行代码;等等。

动作侦听器的东西。

class MyButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(view.getBtnStart()))
        {
            autoClick.unTerminate();
            bool = true;
            getInfo();
        }
        if (e.getSource().equals(view.getBtnExit()))
        { 
            System.exit(0);
        }
        if (e.getSource().equals(view.getBtnStop()))
        {
            bool = false;
            autoClick.terminate();
        }
    }//end of actionPerformed
}//end of inner class

主题

Thread t2 = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Timer timer = new Timer(4000, new ActionListener() {//301000 5minutes and 1second
                            @Override
                            public void actionPerformed(ActionEvent evt) {
                                autoClick.timeOverload();
                            }                                
                        });
                        //if (!bool){timer.stop();}
                        timer.setRepeats(true); //false only repeates once
                        timer.start();
                    }
                    });//end of t2

重复调用timeOverload方法。

感谢您的时间并帮助新手:)。

1 个答案:

答案 0 :(得分:0)

以下是如何在线程外部声明实例并能够在其外部控制它的快速示例。

public static void main(String[] args){
    final Timer timer = new Timer(500, new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            System.out.println("tick");
        }
    });
    timer.setRepeats(true);

    Thread t = new Thread(new Runnable() {

        public void run() {
            timer.start();
        }
    });
    t.start();

    try {
        Thread.sleep(2600);
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }

    timer.stop();
}

基本上,您需要设置要在匿名类中使用的实例final(ActionListener实现)。

在这里,我只是启动线程然后暂停该过程几秒钟并停止计时器。

请注意,此处,Thread不会执行任何其他操作,因此它会直接结束。你需要稍微调整一下以满足你的需求,但你有一个有效的例子。

编辑:( DevilsHnd,如果您发布答案,请通知我,我会删除此部分)

使用标志(此处为类)

public class Main {

    public static void main(String[] args){
        new Main();
    }

    boolean running = true;

    public Main(){
        final Timer timer = new Timer(500, new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                if(!running){
                    ((Timer)e.getSource()).stop();
                } else {
                    System.out.println("tick");
                }
            }
        });
        timer.setRepeats(true);
        timer.start();

        try {
            Thread.sleep(2600);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        stop();
    }

    public void stop(){
        running = false;
    }
}

调用Main.stop()会将标志设置为false,在执行的每个操作中,检查此标志,如果为false,则从事件中获取计时器(在源中)并停止。