Для этого метода здесь блок
public void pingAllLabs() throws IOException{
for (int i = 0;i<list.listOfLabs.size();i++{
list.listOfLabs.get(i).printBroke(fileName);
updateImages(list.listOfLabs.get(i),i);
}
}
Внести следующие изменения
public void pingAllLabs() throws IOException{
new Thread(() -> {
for (int i = 0;i<list.listOfLabs.size();i++) {
list.listOfLabs.get(i).printBroke(fileName);
updateImages(list.listOfLabs.get(i),i);
}
}).start();
}
}
И изменить этот блок
if (!list.isEmpty()){
images.get(i).setImage(red);
System.out.println("Setting "+lab.getName()+" to red");
}
else{
System.out.println("Setting to green");
images.get(i).setImage(green);
}
внести следующие изменения
if (!list.isEmpty()){
Platform.runLater( () -> images.get(i).setImage(red))
System.out.println("Setting "+lab.getName()+" to red");
}
else{
System.out.println("Setting to green");
Platform.runLater( () -> images.get(i).setImage(green))
}
Так что теперь вы не будете блокировать поток пользовательского интерфейса, а также позволите выполнять обновления асинхронно.
Insights
Проблема сродни вопросу, который вы связали, вы запускаете цикл for в потоке приложения JavaFx, что приводит к тому, что изменения модели не отображаютсянемедленно, но только после того, как вы вернетесь из pingAllLab()
, который возвращается только после updateImages()
, который содержит цикл.Приведенный выше код запускает логику добавления изображения в другом потоке, а затем отправляет обновления в очередь событий пользовательского интерфейса, используя Platform.runLater()
.
Следовательно, всякий раз, когда вы пишете код, который каким-либо образом влияет на пользовательский интерфейс, используйте Platform.runLater()