显示倒计时

时间:2012-12-10 17:00:57

标签: java swing timer jlabel

我需要在我的应用程序中实现一个计时器,它将在10秒到0秒之间进行倒计时。 并在JLabel显示倒计时。

这是我的实施;

...
Timer t = new Timer(1000, new List());
        t.start();

}

class List implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        int sec = 0;
        label.setText(""+sec);
        // Do a if- condition check to see if the clock has reached to, and then stop

    }

}

我期待JLabel从0到10开始计数然后停止。但事实并非如此。 JLabel设置值0并且它不会增加。

更新1

    t = new Timer(1000, new Listner());
    t.start();


}

class Listner implements ActionListener{
    private int counter = 0;
    @Override
    public void actionPerformed(ActionEvent e) {
        lable.setText(""+ (counter++));

        if (counter == 10)
              t.removeActionListener(this);

    }

}

4 个答案:

答案 0 :(得分:4)

每次调用计时器时都会将int变量sec声明为0.因此Label不会更新。

您应该将sec变量声明为全局变量,然后在actionPerformed方法中每次调用它时都会增加其值。

 public int sec = 0;
 class List implements ActionListener{

   @Override
   public void actionPerformed(ActionEvent e) {
        sec++;
        label.setText(""+sec);
        // Do a if- condition check to see if the clock has reached to, and then stop

  }

}

答案 1 :(得分:4)

您没有在任何地方存储或递增secs,所以我看不到它应该如何更新,请尝试使用

Timer timer;

void start() {
  timer = new Timer(1000,new List());
}

class List implements ActionListener {
    private counter = 0;
    @Override
    public void actionPerformed(ActionEvent e) {
        label.setText(""+counter++);

        if (counter == 10)
          timer.removeActionListener(this);
    }
}

请注意,您需要在某个位置存储对计时器的引用,以便在倒计时完成后从其中删除侦听器。

答案 2 :(得分:3)

一个完整的例子

public class ATimerExample {

    Timer timer;
    int counter = 0;

    public ATimerExample() {
        final JFrame frame = new JFrame("somethgi");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JLabel label = new JLabel("0");
        JPanel panel = new JPanel();
        panel.add(label, BorderLayout.SOUTH);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);

        timer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText(String.valueOf(counter));
                counter++;
                if (counter == 10) {
                    //timer.removeActionListener(this);
                      timer.stop();
                }
            }
        });
        timer.start();
    }

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

            @Override
            public void run() {
                new ATimerExample();
            }
        });
    }
}

答案 3 :(得分:1)

由于java以毫秒为单位读取时间,因此它应该是10000而不是1000.尝试使用您的代码并查看是否有效。当我想要30秒时,我遇到了同样的问题。而不是写Timer T = new Timer(30000,new List()); t.start();

我写了Timer t = new Timer(3000,new List());         t.start();

这让我的程序在3秒后停止。我建议你使用10000而不是1000.

请记住:在List类中执行:t.stop()。感谢