使用Swing Timer更新标签

时间:2015-05-23 21:20:43

标签: java swing timer jlabel

我在使用这段代码时遇到了一些麻烦。

我正在使用随机数启动计时器,我希望每秒都用倒计时更新一个JLabel。但是我还没有想出怎么做,因为定时器触发的唯一监听器就在它的末尾(我知道)。

这里是代码:

int i = getTimer(maxWait);
te1 = new Timer(i, this);
label.setText(i+"");
te1.start();

...

public int getTimer(int max){
    Random generator = new Random();
    int i = generator.nextInt(max);
    return i*1000;
}

...

public void actionPerformed(ActionEvent ev){
    if(ev.getSource() == te1){
        label.setText(i+"");
        te1.stop();
    }
}

1 个答案:

答案 0 :(得分:2)

我真的不明白你的问题,为什么你使用Random,但这里有一些观察结果:

  

我想每秒都用倒计时更新一个JLabel。

然后你需要将Timer设置为每秒触发一次。所以Timer的参数是1000,而不是一些随机数。

此外,在actionPerformed()方法中,第一次触发时会停止Timer。如果您正在进行某种倒计时,那么只有在时间达到0时才会停止计时器。

以下是使用Timer的简单示例。它只是每秒更新一次:

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;

    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)
    {
        //System.out.println(e.getSource());
        timeLabel.setText( new Date().toString() );
    }

    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();
            }
        });
    }
}

如果您需要更多帮助,请使用正确的SSCCE更新您的问题,以证明问题。所有问题都应该有一个适当的SSCCE,而不仅仅是几行代码,这样我们就可以理解代码的上下文。