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 | Остановка таймера. |