簡體   English   中英

是否在JavaFx…線程中將項目添加到ListView?

[英]Adding items to ListView in JavaFx… threading?

我正在嘗試在處理時向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上有一個談論它的線程)。

由於(非常簡單)循環的執行速度,我認為您的UI處於凍結狀態。

您還應該看看JavaFX中的並發性

GUI掛起是因為您通過在線程中連續調用Platform.runLater()來阻止JavaFX應用程序線程。

您可以通過在for循環中添加sleep語句來避免此quick fix ,從而執行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-並發和更新標簽

您可以在列表中添加這些字符串后進行動畫/ 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));
            }
     }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM