使用SwingWorker的GUI倒计时计时器 - 未正确更新

时间:2014-01-22 09:49:18

标签: java swingworker

我正在尝试使用swingworker制作一个倒数计时器,问题是当秒数变为零时,程序将它们设置为60并扣除一个。我确实使程序没有GUI而且它的工作原理很完美,但是使用swingworker我的计时器看起来像这样

1:0:2
1:0:1
0:59:60

这有点不对,应该是 1:0:1
1:0:0
0:59:59

我的班级都有相同的逻辑。我猜这与将整个Time对象发送到'process'有关,但我无法向自己解释。

doInBackground()方法:

protected Void doInBackground() throws Exception {
            Integer hours = Integer.parseInt(hoursField.getText());
            Integer minutes = Integer.parseInt(minutesField.getText());
            Integer seconds = Integer.parseInt(secondsField.getText());

            Time time = new Time(hours, minutes, seconds);

            if(minutes < 59 & seconds < 59) {               
                if(hours >=0 & minutes >=0 & seconds >=0) {
                    boolean count = true;
                    while(count) {
                        try {
                            Thread.sleep(1000);
                        } catch(InterruptedException e) {
                            Logger.getLogger(Chronometer.class.getName()).log(Level.SEVERE, null, e);
                        }
                        time.setSeconds(time.getSeconds() - 1);
                        publish(time);
                        if(time.getHours() == 0 & time.getMinutes() == 0 & time.getSeconds() == 0) {
                            count = false;
                        }
                        if(time.getSeconds() == 0) {
                            time.setSeconds(60);
                            if(time.getMinutes() != 0) {
                                time.setMinutes((time.getMinutes() - 1));
                            }else if(time.getMinutes() == 0) {
                                time.setHours((time.getHours() - 1));
                                if(time.getHours() >= 0) {
                                    time.setMinutes(59);
                                }                                    
                                if(time.getHours() < 0) {
                                    time.setHours(0);
                                }
                            }
                        }

                    }
                }else {
                    System.exit(0);
                }
            }
            return null;
        }

这是一个简单的java类,它使用相同的逻辑:

boolean count = true;
        while(count) {
            try {
                Thread.sleep(1000);
            } catch(InterruptedException e) {

            }
            seconds--;
            System.out.println(hours + ": " + minutes + ": " + seconds);
            if(hours == 0 & minutes == 0 & seconds == 0) {
                count = false;
            }
            if(seconds == 0) {
                seconds = 60;
                if(minutes != 0){ 
                    minutes--;
                }else if(minutes == 0) {
                    hours--;
                    if(hours >=0){
                        minutes = 59;
                    }                    
                    if(hours < 0) {
                        hours = 0;
                    }
                } 
            }
        }

如果有人能指出我的错误,我会非常感激。 感谢

添加流程方法

public void process(List<Time> time) {
            for(Time t : time) {                    
                showField.setText(String.valueOf(t.getHours()) + ": " + String.valueOf(t.getMinutes())+ ": " + String.valueOf(t.getSeconds()));
            }
        }

2 个答案:

答案 0 :(得分:1)

我没有深入研究你的逻辑,但你可以使用看似更简单的Calendar来实现同样的目标。

    Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR_OF_DAY, hours);
    c.set(Calendar.MINUTE, minutes);
    c.set(Calendar.SECOND, seconds);
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");

    Date d = c.getTime();
    System.out.println(format.format(d)); 
    while(count) {
        c.set(Calendar.SECOND, c.get(Calendar.SECOND)-1); //decrement 1 second at a time
        d = c.getTime();
        System.out.println(format.format(d)); 
        Thread.sleep(1000); //Pause for a second between each print
    }

为简单起见,我使用了SimpleDateFormat("HH:mm:ss")。如果您需要不同的时间字段,则可以使用Calendar.get(..)方法获取相同的

答案 1 :(得分:1)

你的行

if(time.getSeconds() == 0) time.setSeconds(60);

需要

if(time.getSeconds() == 0) time.setSeconds(59);

颠倒这两条线:

time.setSeconds(time.getSeconds() - 1);
publish(time);
像这样:

publish(time);
time.setSeconds(time.getSeconds() - 1);

扣除是正确的,但它没有显示结果,因为当秒达到cero时,它的执行条件,而不显示中间时间。

更改此行:

 if(time.getSeconds() == 0)

这个:

 if(time.getSeconds() < 0)

而且:

 if(time.getHours() == 0 & time.getMinutes() == 0 & time.getSeconds() == 0)

 if(time.getHours() == 0 & time.getMinutes() == 0 & time.getSeconds() < 0)