使用 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,而不仅仅是几行随机代码,这样我们才能理解代码的上下文。
这段代码我遇到了一些问题。
我正在启动一个带有随机数的计时器,我想每秒更新一个带有倒计时的 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,而不仅仅是几行随机代码,这样我们才能理解代码的上下文。