2

我正在做一个猜谜游戏,但我在 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();

PS这是我在猜谜游戏中解决的最后一个问题,之后一切都会好起来的。

4

2 回答 2

2

我在评论中误导了你。不要将其设为final,而是使其成为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();
}
于 2013-10-16T14:15:10.560 回答
2

是动作事件的Timer来源,所以如果你不想让它成为类的字段,你可以使用它:

@Override
public void actionPerformed(ActionEvent e) {
    ...
    gscore--;
    if (gScore == 980) {
        ((Timer) e.getSource()).stop();
    }
}
于 2013-10-16T14:27:22.913 回答