я пытаюсь сделать таймер обратного отсчета с помощью swingworker, проблема в том, что когда секунды доходят до нуля, программы возвращают их к 60 и вычитают один. Я сделал программу без графического интерфейса, и она работает просто отлично, но с помощью swingworker мой таймер выглядит так это
1: 0: 2
1: 0: 1
0: 59: 60
что немного неправильно и должно быть
1: 0: 1
1: 0: 0
0: 59: 59
Оба моих класса основаны на одной и той же логике. Я думаю, это как-то связано с отправкой всего объекта Time в «процесс», но я просто не могу объяснить это себе.
Метод 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()));
}
}