我正在尝试使用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()));
}
}
答案 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)