Timer
Фасет Timer
предназначен для запуска некоторого кода контроллера экрана через определенные промежутки времени. Он работает в потоке, который обрабатывает события пользовательского интерфейса. Следовательно, он может обновлять экранные компоненты. Timer
перестает работать после закрытия экрана, для которого он был создан.
Атрибуты
Timer
определяется в элементе facets
XML-дескриптора экрана и имеет следующие атрибуты:
-
delay
- обязательный атрибут. Определяет интервал времени в миллисекундах.
-
autostart
- необязательный атрибут. Значение по умолчанию –false
, что означает, что таймер запустится только при вызове его методаstart()
. Если установлено значениеtrue
, таймер запускается сразу после открытия экрана.
-
repeating
- необязательный атрибут. Включает повторное выполнение таймера. Если для атрибута установлен вtrue
, таймер работает циклически с равными интервалами, определенными в атрибутеdelay
. В противном случае таймер запускается только один раз столько миллисекунд, сколько указано в атрибутеdelay
.
События и слушатели
Чтобы сгенерировать заглушку слушателя в Jmix Studio, выберите фасет в XML-дескрипторе экрана или на панели иерархии Jmix UI и используйте вкладку Handlers на панели инспектора Jmix UI. В качестве альтернативы вы можете воспользоваться кнопкой Generate Handler на верхней панели контроллера экрана. |
TimerActionEvent
TimerActionEvent
позволяет выполнить некоторый код во время, указанное в атрибуте delay
. Если атрибут repeating
установлен в true
, указанный в этом событии код будет выполняться периодически, пока таймер не будет остановлен.
@Subscribe("timer")
protected void onTimerFacetTick(Timer.TimerActionEvent event) {
seconds += event.getSource().getDelay() / 1000;
notifications.create(Notifications.NotificationType.TRAY)
.withCaption("Timer tick")
.withDescription(seconds + " seconds passed")
.show();
}
Чтобы создать слушателя события программно, используйте метод addTimerActionListener()
.
TimerStopEvent
TimerStopEvent
позволяет выполнить некоторый код после остановки таймера.
@Subscribe("timer")
public void onTimerTimerStop(Timer.TimerStopEvent event) {
notifications.create(Notifications.NotificationType.TRAY)
.withCaption("Timer stopped")
.show();
}
Чтобы создать слушателя события программно, используйте метод addTimerStopListener()
.
Пример использования
<window xmlns="http://jmix.io/schema/ui/window"
caption="msg://timerScreen.caption">
<facets>
<timer id="timer"
autostart="false"
delay="5000"
repeating="true"/> (1)
</facets>
<layout>
<hbox spacing="true"> (2)
<button id="startTimer"
caption="Start"
icon="PLAY"/>
<button id="stopTimer"
caption="Stop"
icon="STOP"/>
<label id="statusLabel"
align="MIDDLE_LEFT"
value="Timer is not running"/>
</hbox>
</layout>
</window>
1 | Определение таймера в элементе facets . |
2 | Определение layout для управления таймером. |
@Autowired
protected Timer timer;
@Autowired
protected Label<String> statusLabel;
@Autowired
protected Notifications notifications;
protected int seconds = 0;
@Subscribe("startTimer")
protected void onStartTimerClick(Button.ClickEvent event) {
timer.start(); (1)
statusLabel.setValue("Timer started");
notifications.create(Notifications.NotificationType.TRAY)
.withCaption("Timer started")
.show();
}
@Subscribe("timer")
protected void onTimerTick(Timer.TimerActionEvent event) {
seconds += event.getSource().getDelay() / 1000; (2)
notifications.create(Notifications.NotificationType.TRAY)
.withCaption("Timer tick")
.withDescription(seconds + " seconds passed")
.show();
}
@Subscribe("stopTimer")
protected void onStopTimerClick(Button.ClickEvent event) {
timer.stop(); (3)
seconds = 0;
statusLabel.setValue("Timer stopped");
notifications.create(Notifications.NotificationType.TRAY)
.withCaption("Timer stopped")
.show();
}
1 | Запуск таймера по нажатию кнопки startTimer . |
2 | Подсчет длительности работы таймера. |
3 | Остановка таймера. |