3.5.4.1. Timer
定时器是一个非可视化的界面组件,可以以一定的时间间隔运行一些界面控制器的代码。定时器是在一个处理用户事件的线程里面运行的,所以可以更新界面组件。当创建定时器的界面被关闭之后,定时器就会停止工作了。
创建定时器的主要方法就是在界面 XML 描述中的 facets
元素中进行声明。
定时器使用 timer
元素描述。
delay
- 必选属性;按毫秒定义定时器执行的时间间隔。autostart
– 可选属性;当设置成true
的时候,定时器会在界面打开的时候立即自动启动。默认值是false
,也就是说只有在调用定时器的start()
方法之后才会启动。repeating
– 可选属性;开启定时器的重复执行模式。如果这个属性设置的是true
,定时器会按照delay
设置的时间间隔反复一轮一轮的执行。否则只会在delay
设定的毫秒时间之后执行一次。
可以在界面控制器中订阅 TimerActionEvent
事件,以便定时执行一些代码。
下面的示例演示了定义定时器并在控制器内订阅其事件:
<window xmlns="http://schemas.haulmont.com/cuba/screen/window.xsd" ...>
<facets>
<timer id="myTimer" delay="3000" autostart="true" repeating="true"/>
</facets>
@Inject
private Notifications notifications;
@Subscribe("myTimer")
private void onTimer(Timer.TimerActionEvent event) {
notifications.create(Notifications.NotificationType.TRAY)
.withCaption("on timer")
.show();
}
定时器可以作为字段注入一个界面控制器,也可以通过 getWindow().getFacet()
方法获得。定时器的执行可以用定时器的 start()
和 stop()
方法控制。对于已经启动的定时器,会忽略再次调用 start()
,但是当定时器使用 stop()
方法停止之后,可以通过 start()
方法再次启动。
下面示例展示了如何通过 XML 描述来定义定时器以及在控制器中使用定时器监听:
<window xmlns="http://schemas.haulmont.com/cuba/screen/window.xsd" ...>
<facets>
<timer id="helloTimer" delay="5000"/>
<facets>
@Inject
private Timer helloTimer;
@Inject
private Notifications notifications;
@Subscribe("helloTimer")
protected void onHelloTimerTimerAction(Timer.TimerActionEvent event) { (1)
notifications.create()
.withCaption("Hello")
.show();
}
@Subscribe("helloTimer")
protected void onHelloTimerTimerStop(Timer.TimerStopEvent event) { (2)
notifications.create()
.withCaption("Timer is stopped")
.show();
}
@Subscribe
protected void onInit(InitEvent event) { (3)
helloTimer.start();
}
1 | 定时器执行处理器 |
2 | 定时器停止事件 |
3 | 启动定时器 |
定时器也可以在控制器里面创建,如果是这样的话,需要显式的使用 addFacet()
方法把这个定时器加到界面中,比如:
@Inject
private Notifications notifications;
@Inject
private UiComponents uiComponents;
@Subscribe
protected void onInit(InitEvent event) {
Timer helloTimer = uiComponents.create(Timer.NAME);
getWindow().addFacet(helloTimer); (1)
helloTimer.setId("helloTimer"); (2)
helloTimer.setDelay(5000);
helloTimer.setRepeating(true);
helloTimer.addTimerActionListener(e -> { (3)
notifications.create()
.withCaption("Hello")
.show();
});
helloTimer.addTimerStopListener(e -> { (4)
notifications.create()
.withCaption("Timer is stopped")
.show();
});
helloTimer.start(); (5)
}
1 | 在页面中添加定时器 |
2 | 设置定时器参数 |
3 | 添加执行处理器 |
4 | 添加停止事件监听器 |
5 | 启动定时器 |