在JavaFx中添加项目到ListView ..线程



我试图在JavaFX中添加一个字符串到ListView,同时处理,但它一直冻结我的GUI。

我试过下面的线程-但似乎不能让它为ListView工作。
有人知道如何/有一个例子,我如何在JavaFX中更新ListView,同时处理数据?

new Thread(new Runnable() {
    @Override public void run() {
        for (int i=1; i<=1000000; i++) {
            final int counter = i;
            Platform.runLater(new Runnable() {
                @Override public void run() {
                    recentList.getItems().add(Integer.toString(counter));
                }
            });
        }
    }}).start();

使用Platform.runLater()是正确的方法。您还可以将Integer.toString(counter)的String结果存储在后台线程(而不是UI线程)中。顺便说一下,您应该使用String。valueOf(有一个线程在StackOverflow上讨论它)。

I 假设你的UI冻结是因为(非常简单的)循环的执行速度。

您还应该看看JavaFX中的并发性

你可以在列表中添加这些字符串后进行动画/ui更新,或者只使用一次Platform.runLater(不建议):

Platform.runLater(new Runnable() {
  for (int i=1; i<=1000000; i++) {
        final int counter = i;
            @Override public void run() {
                recentList.getItems().add(Integer.toString(counter));
            }
     }
});

你的GUI挂起,因为你正在阻塞JavaFX应用程序线程通过调用Platform.runLater()连续在你的线程。

您可以通过在for循环中添加sleep语句来执行quick fix以避免它。

for (int i=1; i<=1000000; i++) {
     final int counter = i;
     Platform.runLater(new Runnable() {
        @Override public void run() {
            recentList.getItems().add(Integer.toString(counter));
        }
     });
     // Add Sleep Time
     Thread.sleep(some milli seconds);
}

要使用更合适和明智的方式,请使用AnimationTimer,如

所示。

JavaFX -并发和更新标签

相关内容

  • 没有找到相关文章

最新更新