如何在匿名类中停止Swing计时器?

时间:2013-10-16 13:46:13

标签: java swing

我正在做一个猜谜游戏但是 我在Swing计时器中遇到问题,因为当我推出IF语句时我无法阻止它。 这是我遇到问题的代码的一部分。

continueButton.addActionListener(new  ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        f.add(firstPicblur);
        f.invalidate();
        f.remove(loadingEffectBtn);
        f.setVisible(true);
        f.repaint(); 
        Timer tt = new Timer(100, new ActionListener() {                
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                f.add(firstPiclabelA,BorderLayout.NORTH);
                f.invalidate();
                f.remove(loadingEffect);
                f.setVisible(true);
                f.repaint();
                score01.setText("Score: " + gScore);
                gScore--;                     
            }
        });
        tt.start();
        tt.setRepeats(true); 
        if(gScore == 980){
            tt.stop();

P.S这是我在猜测游戏中解决的最后一个问题,在此之后一切都会好的。

2 个答案:

答案 0 :(得分:2)

我在评论中误导了你。而不是使tt成为最终,使其成为封闭类的成员。这是一个例子:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class TimerTest extends JFrame {

    private JLabel label = new JLabel("default");
    private Timer timer;   
    private int gScore = 985;

    public TimerTest() {
        add(label);
        pack();

        timer = new Timer(100, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                gScore--;
                if (gScore == 980) {
                    timer.stop();
                }
                label.setText(String.valueOf(gScore));
            }
        });
        timer.setRepeats(true);
        timer.start();

        setLocationRelativeTo(null);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                TimerTest test = new TimerTest();
                test.setVisible(true);
            }
        });
    }

}

你只需要调用它的构造函数一次,然后依赖它的start()stop()方法,所以你的代码看起来应该类似于:

continueButton.addActionListener(new  ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        f.add(firstPicblur);
        f.invalidate();
        f.remove(loadingEffectBtn);
        f.setVisible(true);
        f.repaint(); 
        tt.start();
}

答案 1 :(得分:2)

Timer是动作事件的来源,因此您可以使用它,如果您不想将其作为该类的字段:

@Override
public void actionPerformed(ActionEvent e) {
    ...
    gscore--;
    if (gScore == 980) {
        ((Timer) e.getSource()).stop();
    }
}
相关问题