3.5.2.4.4. 定时器

API 文档

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

该组件对应的 XML 名称:timer

在 Web 客户端,定时器是基于浏览器的轮询(polling)机制实现,在 desktop 客户端,是基于 javax.swing.Timer 实现的。

创建定时器的主要方法是在界面的 XML 描述中进行声明 - 使用 timers 元素,位置在 dsContextlayout 元素之间。

  • delay - 必选属性;按毫秒定义定时器执行的时间间隔。

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

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

  • onTimer – 可选属性;定义一个当定时器触发的时候需要执行的方法名称。这个对应的方法必须定义在界面控制器中,需要是 public 的,而且有一个 com.haulmont.cuba.gui.components.Timer 类型的参数。

下面这个例子演示了使用定时器来周期性的刷新表格内容:

  1. <window ...
  2. <dsContext>
  3. <collectionDatasource id="bookInstanceDs" ...
  4. </dsContext>
  5. <timers>
  6. <timer delay="3000" autostart="true" repeating="true" onTimer="refreshData"/>
  7. </timers>
  8. <layout ...
  1. @Inject
  2. private CollectionDatasource bookInstanceDs;
  3. public void refreshData(Timer timer) {
  4. bookInstanceDs.refresh();
  5. }

定时器可以注入一个界面控制器,也可以通过 Window.getTimer() 方法获得。定时器的执行可以用定时器的 start()stop() 方法控制。对于已经启动的定时器,会忽略再次调用 start(),但是当定时器使用 stop() 方法停止之后,可以通过 start() 方法再次启动。

下面这个例子演示了在 XML 中定义定时器,然后在控制器里面使用定时器监听:

  1. <timers>
  2. <timer id="helloTimer" delay="5000"/>
  3. </timers>
  1. @Inject
  2. private Timer helloTimer;
  3. @Inject
  4. private Notifications notifications;
  5. @Subscribe("helloTimer")
  6. protected void onHelloTimerTimerAction(Timer.TimerActionEvent event) { (1)
  7. notifications.create()
  8. .withCaption("Hello")
  9. .show();
  10. }
  11. @Subscribe("helloTimer")
  12. protected void onHelloTimerTimerStop(Timer.TimerStopEvent event) { (2)
  13. notifications.create()
  14. .withCaption("Timer is stopped")
  15. .show();
  16. }
  17. @Subscribe
  18. protected void onInit(InitEvent event) { (3)
  19. helloTimer.start();
  20. }
1定时器执行处理器
2定时器停止事件
3启动定时器

定时器也可以在控制器里面创建,如果是这样的话,需要显式的把这个定时器加到界面中,比如:

  1. @Inject
  2. private Notifications notifications;
  3. @Inject
  4. private UiComponents uiComponents;
  5. @Subscribe
  6. protected void onInit(InitEvent event) {
  7. Timer helloTimer = uiComponents.create(Timer.NAME);
  8. getWindow().addTimer(helloTimer); (1)
  9. helloTimer.setId("helloTimer"); (2)
  10. helloTimer.setDelay(5000);
  11. helloTimer.setRepeating(true);
  12. helloTimer.addTimerActionListener(e -> { (3)
  13. notifications.create()
  14. .withCaption("Hello")
  15. .show();
  16. });
  17. helloTimer.addTimerStopListener(e -> { (4)
  18. notifications.create()
  19. .withCaption("Timer is stopped")
  20. .show();
  21. });
  22. helloTimer.start(); (5)
  23. }
1在页面中添加定时器
2设置定时器参数
3添加执行处理器
4添加停止事件监听器
5启动定时器