Java 瓦丁时间计数器

Java 瓦丁时间计数器,java,vaadin,Java,Vaadin,我想实现一个显示运行时间的计数器。用例应该是这样的:单击一个按钮,开始时间就确定了。在文本字段中,应显示增加的运行时间。一秒钟后1,两秒钟后2,依此类推。当我点击另一个按钮时,时间计数器停止,当前秒数冻结 long startTime = System.currentTimeMillis(); long elapsedTime = System.currentTimeMillis() - startTime; String elapsedSeconds = Long.toString(elaps

我想实现一个显示运行时间的计数器。用例应该是这样的:单击一个按钮,开始时间就确定了。在文本字段中,应显示增加的运行时间。一秒钟后1,两秒钟后2,依此类推。当我点击另一个按钮时,时间计数器停止,当前秒数冻结

long startTime = System.currentTimeMillis();
long elapsedTime = System.currentTimeMillis() - startTime;
String elapsedSeconds = Long.toString(elapsedTime / 1000);
this.textField.setValue(elapsedSeconds);
我如何实现这一秒?相应的秒数将显示在文本字段中。我是否必须每秒刷新文本字段?如果是这样,我该怎么做

编辑:


你需要三样东西

1) 执行更新的任务或线程

下面是一个关于如何执行任务的示例:。本例使用10分钟的间隔,但您可以将其更改为1秒

2)
ui.access()

如果通过第二个线程更新UI,则需要在
UI.access()调用中更新它,以避免数据损坏或死锁

ui.access(() -> textField.setValue(elapsedSeconds));
您可以在此处阅读更多内容:

3) 您需要将
@Push
添加到视图中

默认情况下,Vaadin是一个框架,每次更新都从浏览器交互开始,它执行服务器往返,然后将指令发送回浏览器,告知UI应如何更新。使用单独的线程时,更新请求不会来自浏览器。但是服务器,因此没有打开的浏览器请求来响应。因此,在用户单击某个内容之前,所有UI更新都不会在浏览器中结束。将注释
@Push
添加到视图时,它会指示浏览器立即打开对服务器的请求,该请求将保持打开状态,直到浏览器中有新数据要渲染。数据一出现,就被推送到浏览器


更多信息请点击此处:

谢谢!因此,在我希望每秒更新的文本字段所在的视图中,我需要添加Push注释。在同一个类中,我必须添加
Timer=new Timer();时间表(新的实时时间(startTime),0,1000)我在新的LiveTime类中定义了什么,特别是在构造函数和run方法中?LiveTime应该扩展TimerTask,并且只有run方法。不需要构造函数。run方法应该定义每秒应该发生的事情。在您的情况下,听起来您希望计算时间并更新access调用中的文本字段。大致:
java类Hello扩展TimerTask{public void run(){long startTime=System.currentTimeMillis();long elapsedTime=System.currentTimeMillis()-startTime;String elapsedSeconds=long.toString(elapsedTime/1000);this.ui.access(()->this.textField.setValue(elapsedSeconds));}
但是startTime在另一个类中定义,应该传递给LiveTime类。另外,我不能在LiveTime类中执行
这个.ui
,因为LiveTime类没有ui。我需要访问视图的ui,其中包含textfield。让它成为一个内部类,如示例所示。然后,您可以调用外部类的字段,包括UI和文本字段。好的……现在出现错误TimerRead.run()行:not Available。我在帖子中添加了新代码
ui.access(() -> textField.setValue(elapsedSeconds));