java Vaadin中的计时器

pgx2nnw8  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(125)

我想实现一个显示运行时间的计数器。用例应该如下所示:单击按钮,开始时间被确定。在文本字段中,增加的运行时间应显示。因此,一秒后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));
        }
    }
mkshixfv

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()调用中更新它,以避免数据损坏或死锁。

ui.access(() -> textField.setValue(elapsedSeconds));

您可以在这里阅读更多: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

    • 更新2023:**如果您收到错误:"could not start Tomcat server",@Push必须放在Spring Boot应用的入口点,这样才能为整个Spring App启动双工连接,在大多数Vaadin情况下,它是Application.java类:
@SpringBootApplication()
@Theme(value = "mytodo")
@NpmPackage(value = "line-awesome", version = "1.3.0")
@Push(PushMode.AUTOMATIC) // <-------------------
public class Application implements AppShellConfigurator {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Kudos to this answer.

相关问题