Как принудительно обновить textArea в JavaFX
Допустим, у меня есть TextArea textArea (использую JavaFX). И я хочу, чтобы сообщения в этом поле выходили с некоторой паузой между сообщениями. То есть я делаю так:
textArea.appendText("A");
Thread.sleep(3000);
textArea.appendText("B");
Но по факту так не отрабатывает. Сначала проходит 3 секунды, после чего А и В добавляются одновременно. Подозреваю, что так получается, потому что отрисовка ГУИ происходит в отдельном потоке.
Есть ли какой-то способ принудительно, "на лету", здесь и сейчас обновлять textArea прямо в коде после добавления первого сообщения? Возможно ли как-то, например, приостановить мейн поток до тех пор, пока ГУИ поток не отрисует первое сообщение, и только потом продолжать выполнение кода в мейн потоке?
Или какой ещё может быть способ решения данной проблемы?
Ответы (1 шт):
В данном случае вы паузу делаете в том же потоке, в котором работает GUI, поэтому работа GUI блокируется на время паузы. Работу GUI не получится вынести в отдельный поток, поэтому наоборот нужно вынести кусок кода с задержкой в отдельный поток, изменения интерфейса делать через Platform.runLater (чтобы они выполнялись в основном потоке).
Thread thread = new Thread(() -> {
Platform.runLater(() -> textArea.appendText("A"));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
return; // Поток прерван извне, просто завершить работу
}
Platform.runLater(() -> textArea.appendText("B"));
});
thread.start();
Аналогично через CompletableFuture:
CompletableFuture.runAsync(() -> {
Platform.runLater(() -> textArea.appendText("A"));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
return;
}
Platform.runLater(() -> textArea.appendText("B"));
});