如何在代号一中刷新 UI 上的计数器而不阻塞其余计数器?

How to refresh a counter on the UI without blocking the rest, in codename one?

我尝试在 UI 上获取分数计数,每秒刷新几次。刷新不应阻止 UI 的其他元素正常工作(按钮应保持可点击等)

我阅读了 EDT 上的文档并尝试添加一个从 Form 的构造函数调用的方法:

  private void loopScore() {
        Display.getInstance().callSerially(
                () -> {
                    while (true) {
                        try {
                            MyApplication.score = MyApplication.score + 1;
                            this.gui_Score.setText(String.valueOf(MyApplication.score));
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            //do something
                        }
                    }
                });
    }

但这不会更新 gui_Score 并且会阻塞 UI 的其余部分。有帮助吗?

一个解决方案是覆盖 Formanimate 方法。

此方法在 EDT 的每个新周期(大约每毫秒)调用一次,以验证是否需要重新绘制任何内容。

重写该方法允许插入一行代码更新 Label 的文本,其中分数为:

@Override
public boolean animate() {
    if (System.currentTimeMillis() / 1000 > lastRenderedTime / 1000) {
        lastRenderedTime = System.currentTimeMillis();
        computeScore();
        this.gui_Score.setText(String.valueOf(MyApplication.score));
        return true;
    }
    return false;

}

private void computeScore() {
    MyApplication.score = MyApplication.score + 3;
}

然后,你需要用registerAnimated方法注册这个动画。我从 Form:

的构造函数中完成
public Form1(com.codename1.ui.util.Resources resourceObjectInstance) {
    initGuiBuilderComponents(resourceObjectInstance);
    lastRenderedTime = System.currentTimeMillis();
    registerAnimated(this);
}

现在带有计数器的 Label 每秒刷新一次,增量为 3。UI 的其余部分保持响应,没有任何阻塞。

(通过摆弄时钟动画找到的解决方案demonstrated on this page