如何刷新UI上的计数器而不阻塞其余部分,代号为?

时间:2018-01-21 10:36:10

标签: codenameone event-dispatch-thread

我尝试在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的其余部分。帮助

1 个答案:

答案 0 :(得分:1)

解决方案是覆盖animate的{​​{1}}方法。

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

覆盖该方法允许插入一行代码,更新分数为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); } 每秒刷新一次,显示增量为3.其余的UI保持响应,没有任何阻塞。

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