2015-06-10 26 views
0

我想在处理JavaFX时向ListView添加一个字符串,但它会一直冻结我的GUI。将项目添加到JavaFx中的ListView ...线程?

我试过下面的线程 - 但似乎无法让它为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(); 

回答

1

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

假设由于(非常简单)循环的执行速度,您的UI冻结。

你也应该看看Concurrency in JavaFX

0

你的GUI挂起,因为你是在你的线程中调用Platform.runLater()不断阻塞JavaFX应用程序线程。

您可以通过在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 - Concurrency and updating label

0

你可以做动画/ 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)); 
      } 
    } 
});