使用 Swing 计时器更新标签

Update a Label with a Swing Timer

这段代码我遇到了一些问题。

我正在启动一个带有随机数的计时器,我想每秒更新一个带有倒计时的 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();
    }
}

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

I want to update a JLabel with the countdown, every second.

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

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

这里是一个使用定时器的简单例子。它只是每秒更新一次时间:

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,而不仅仅是几行随机代码,这样我们才能理解代码的上下文。