2015-06-10 57 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)); 
      } 
    } 
});