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

Все XML-атрибуты

Вы можете просматривать и редактировать применимые к фасету атрибуты с помощью панели инспектора Jmix UI в дизайнере экранов Studio.