Здесь есть две проблемы.
- Где появляется
time
в сгенерированной разметке метки? Модель просто содержит сообщение, поэтому, даже если time
изменено, это не будет иметь никакого значения.
- Как вы упомянули,
onTimer()
является окончательным, и даже если это не так, нет гарантии, что он будет вызываться именно каждую секунду.
Таким образом, решение, как это часто бывает в Wicket, состоит в том, чтобы перевернуть его с ног на голову, вместо того, чтобы вставлять данные в ваш вывод, и позволить фреймворку это сделать.
- Вам не нужен отдельный класс
Clock
, используйте только простой Label
без переопределения.
- Создание подкласса
IModel<String>
, в котором хранится метка времени, когда часы должны быть равны нулю.
- Заставьте метод
getObject()
модели вернуть строку, содержащую разницу между нулевым временем часов и текущим временем.
- Установите экземпляр этого как модель вашего
Label
и добавьте поведение таймера ajax.
- Готово.
Ваша модель будет примерно такой:
public class ClockModel implements IModel<String> {
private long zeroTime;
public ClockModel( int timeInSecs ) {
this.zeroTime = System.currentTimeMillis() + (timeInSecs * 1000 );
}
public String getObject() {
return String.valueOf( ( zeroTime - System.currentTimeMillis() ) / 1000 );
}
}
Остальное вы, наверное, догадаетесь.
Обновление: Еще одна вещь, вроде очевидная, но, возможно, стоит упомянуть: в реальном приложении убедитесь, что оставшееся время не отрицательно.