Java Swing Timer倒计时

我必须做一个倒计时程序,也显示十分之一秒; 例如,从10.0秒倒计时,它应显示9.9秒,9.8秒,… 0.0秒

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { timer.start(); timer2.start(); } Double timeLeft=5000; //5 seconds Timer timer=new Timer(1,countDown); Timer timer2=new Timer(1000,countDown2); ActionListener countDown=new ActionListener() { public void actionPerformed(ActionEvent e) { timeLeft--; SimpleDateFormat df=new SimpleDateFormat("mm:ss:S"); jLabel1.setText(df.format(timeLeft)); if(timeLeft<=0) { timer.stop(); } } }; 

结果是,用5秒钟完成5秒钟。

我将上面的代码与另一个Timer进行了比较

 int timeLeft2=5; ActionListener countDown2=new ActionListener() { public void actionPerformed(ActionEvent e) { timeLeft2--; jLabel2.setText(String.valueOf(timeLeft2)); if(timeLeft2<=0) { time2.stop(); } } }; 

他们没有得到相同的自然吗?

更新标签可能需要1毫秒以上,这就是它无法跟上的原因。 如果您只需要显示十分之一秒,那么只需更新您的计时器。

 ActionListener countDown=new ActionListener() { public void actionPerformed(ActionEvent e) { timeLeft -= 100; SimpleDateFormat df=new SimpleDateFormat("mm:ss:S"); jLabel1.setText(df.format(timeLeft)); if(timeLeft<=0) { timer.stop(); } } }; Timer timer=new Timer(100, countdown); 

ticks之间的时间(调用actionPerfomed的时间)是可变的,它只保证它至少为n毫秒

您应该尝试计算Timer启动时间与当前时间之间的差异,而不是依赖某些计数器(这可能会随着时间变得不可靠),例如……

倒数

 import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.text.SimpleDateFormat; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class CountDown { public static void main(String[] args) { new CountDown(); } public CountDown() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private Timer timer; private long startTime = -1; private long duration = 5000; private JLabel label; public TestPane() { setLayout(new GridBagLayout()); timer = new Timer(10, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (startTime < 0) { startTime = System.currentTimeMillis(); } long now = System.currentTimeMillis(); long clockTime = now - startTime; if (clockTime >= duration) { clockTime = duration; timer.stop(); } SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS"); label.setText(df.format(duration - clockTime)); } }); timer.setInitialDelay(0); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (!timer.isRunning()) { startTime = -1; timer.start(); } } }); label = new JLabel("..."); add(label); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } }