2015-06-10 2 views
0

Я пытаюсь добавить строку в ListView в JavaFX во время обработки, но он продолжает замораживать мой графический интерфейс.Добавление элементов в ListView в JavaFx ... threading?

Я пробовал следующие потоки - но, похоже, не может заставить его работать в ListView.
Кто-нибудь знает, как/иметь пример того, как я могу обновлять ListView в JavaFX во время обработки данных?

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) в фоновом потоке (а не в пользовательском интерфейсе). Кстати, вы должны использовать String.valueOf (есть поток в StackOverflow, который говорит об этом).

I Предположим, ваш пользовательский интерфейс замерзает из-за скорости выполнения (очень простой) петли.

Вы также должны взглянуть на Concurrency in JavaFX

0

Ваш GUI зависает, потому что вы блокируете поток приложений JavaFX с помощью вызова Platform.runLater() непрерывно в вашей Thread.

Вы можете выполнить команду quick fix, добавив инструкцию sleep внутри своего цикла, чтобы избежать этого.

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

Вы можете сделать обновление анимация/щ после добавления этих строк в списке или использовать 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)); 
      } 
    } 
}); 
Смежные вопросы