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