我想实现一个显示运行时间的计数器。用例应该如下所示:单击按钮,开始时间被确定。在文本字段中,增加的运行时间应显示。因此,一秒后1,两秒后2,以此类推。当我单击另一个按钮时,计时器停止,当前秒数冻结。
long startTime = System.currentTimeMillis();
long elapsedTime = System.currentTimeMillis() - startTime;
String elapsedSeconds = Long.toString(elapsedTime / 1000);
this.textField.setValue(elapsedSeconds);
我如何实现这一点,相应的秒数将显示在文本字段中。我必须每秒刷新文本字段吗?如果是这种情况,我该怎么做?
编辑:
@Push
public class View {
private final UI ui = this.getUI();
private final long startTime;
public View(final long startTime) {
super();
this.initUI();
this.startTime = startTime;
final Timer timer = new Timer();
timer.schedule(new LiveTime(), 0, 1000);
}
private class LiveTime extends TimerTask {
@Override
public void run() {
final long elapsedTime = System.currentTimeMillis() - View.this.startTime;
final String elapsedSeconds = Long.toString(elapsedTime / 1000);
View.this.ui.access(() -> View.this.textField.setValue(elapsedSeconds));
}
}
1条答案
按热度按时间mkshixfv1#
你需要三样东西。
1.执行更新的任务或线程。
下面是一个如何执行任务的示例:https://www.quora.com/How-do-I-create-a-thread-which-runs-every-one-minute-in-Java。此示例使用10分钟间隔,但您可以将其更改为1秒。
1.第一个月
如果通过第二个线程更新UI,则需要在
ui.access()
调用中更新它,以避免数据损坏或死锁。您可以在这里阅读更多:https://vaadin.com/docs/v14/flow/advanced/tutorial-push-access.html
1.您需要将
@Push
添加到视图中。Vaadin是一个默认的框架,每次更新都从浏览器交互开始,它执行服务器往返,然后将指令发送回浏览器,告诉用户界面应该如何更新。使用单独的线程,更新请求不来自浏览器,而是来自服务器,因此没有打开的浏览器请求需要响应。因此,在用户点击某个东西之前,任何UI更新都不会在浏览器中结束。当您将注解
@Push
添加到视图中时,它会指示浏览器立即打开对服务器的请求,该请求将一直保持打开状态,直到有新数据要在浏览器中呈现。数据到来的那一刻,它被推送到浏览器。更多信息:https://vaadin.com/docs/v14/flow/advanced/tutorial-push-configuration.html
Application.java
类:Kudos to this answer.