计时器不会停止。尝试点击n步

时间:2015-08-03 19:50:03

标签: java timer imagej

我想做一个定时器,每300毫秒执行一次方法mouseRelease 15次。为此,我写了类似的东西:

import java.awt.*;
import java.awt.event.*;
import java.awt.SystemColor;
import java.io.*;
import java.lang.*;
import java.util.StringTokenizer;
import javax.swing.Timer;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

public class myapp extends PlugInFrame implements ActionListener, ItemListener, MouseListener {
     [...]
     int total = 0;
     public void mouseReleased(MouseEvent m) {
            [...]
            if (total == 0){
                timer.setRepeats(true);
                timer.setCoalesce(true);
                timer.start();          
            }else if (total==14){
                timer.stop;
                total =0;
            }     
        }

    Timer timer = new Timer(300, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
             try {
                if (total < 15){
                    total++;
                    Robot r = new Robot();
                    r.mouseRelease(InputEvent.BUTTON1_MASK);    
                }
            } catch(AWTException e) {
                throw new RuntimeException("Failed to create java.awt.Robot for Robo instance", e);
            }
        }
    });
}

我的问题是,尽管它的功能很好,但最终它并没有停止计时器,所以在我完全结束程序之前它不会停止点击。怎么了?

我希望我可以打印var total以查看它是否增加但是此代码是针对ImageJ中的插件而我不知道如何打印并稍后查看日志。

1 个答案:

答案 0 :(得分:0)

当您释放鼠标时,mouseReleased()代码只执行一次。它没有被执行15次。当Timer启动时,ActionListener代码接管并每隔300ms执行一次。

在ActionListener代码本身中更容易停止Timer,因为这是total变量的值递增的地方。

可能是这样的:

public void actionPerformed(ActionEvent e)
{
    if (total == 15)
    {
        Timer timer = (Timer)e.getSource();
        timer.stop();
    }
    else
    {
        // invoke your current code
    }
}

必须承认我并不真正理解你的逻辑,所以我无法提出更好的建议。那就是我不明白你为什么要连续生成15个mouseReleased()事件。

编辑:

一个简单的例子:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;

public class TimerTime extends JPanel implements ActionListener
{
    private JLabel timeLabel;
    private int count = 0;

    public TimerTime()
    {
        timeLabel = new JLabel( new Date().toString() );
        add( timeLabel );

        Timer timer = new Timer(1000, this);
        timer.setInitialDelay(1);
        timer.start();
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        timeLabel.setText( new Date().toString() );
        count++;
        System.out.println(count);

        if (count == 10)
        {
            Timer timer = (Timer)e.getSource();
            timer.stop();
        }
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("TimerTime");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TimerTime() );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}