Timer

Timer facet 支持以一定的时间间隔运行一些界面控制器的代码。定时器是在一个处理用户事件的线程里面运行的,所以可以更新 界面组件。当创建定时器的界面被关闭之后,该界面的定时器就会停止工作了。

属性

Timer 在界面 XML 描述的 facets 元素中定义,有下列属性:

  • delay - 必需属性。定义定时器执行的时间间隔,以毫秒为单位。

  • autostart - 可选属性。默认值是 false,也就是说只有在调用定时器的 start() 方法之后才会启动。当设置成 true 的时候,定时器会在界面打开的时候立即自动启动。

  • repeating - 可选属性。开启定时器的重复执行模式。如果这个属性设置的是 true,定时器会按照 delay 设置的时间间隔重复执行。否则只会在 delay 设定的时间之后执行一次。

事件和处理器

如需使用 Jmix Studio 生成处理器的桩代码,需要在界面 XML 描述或者 Jmix UI 层级结构面板选中 facet 元素,然后用 Jmix UI 组件面板的 Handlers 标签页生成。

或者可以使用界面控制器顶部面板的 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() 方法。

Usage Example

<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 元素中定义 Timer
2 定义控制定时器的 UI 组件和布局。
@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 属性

可以在 Studio 界面设计器中的 Jmix UI 组件面板查看和编辑 facet 支持的属性。