BigBigBiggle BigBigBiggle - 1 month ago 20
Java Question

Java Swing Timer Countdown

I have to make a countdown program which also shows the tenths of a second;
for example from a 10.0 second countdown, it should display 9.9s, 9.8s, ... 0.0s

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


what happens is it's taking more than 5 seconds to finish the 5 seconds.

I compared the code above with another Timer

int timeLeft2=5;

ActionListener countDown2=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
timeLeft2--;

jLabel2.setText(String.valueOf(timeLeft2));
if(timeLeft2<=0)
{
time2.stop();
}
}
};


is it natural that they don't get the same?

Answer

Updating the label probably takes more that 1ms, which is why it can't keep up. If you only need to display tenths of a second, simply have your timer update less often.

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