Обновление UI JavaFX во время выполнения

233
03 апреля 2022, 04:50

Есть Label. Я хочу получить следующий алгоритм:

Нажатие на кнопку -> Установить текст("test1") -> что-то делать -> Установить текст("test2").

Но поле нажатия, устанавливается текст "test2".

// Action нажатия на кнопку
    Platform.runLater(() -> info.setText("test1"));
// Что-то делаем. (Background задача)
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Platform.runLater(() -> info.setText("test2"));

Я даже пробовал создать класс, наследующий от Service, который реализует

@Override
protected Task<Void> createTask()

В котором я устанавливал текст.

Естественно пробовал info.setText("test1") -> background-задача в отдельном потоке -> info.setText("test2") Но всё равно не получается. Не могли бы Вы мне подсказать: как в рантайме изменить элемент интерфейса?

Answer 1

Класс потока:

class MyThread extends Thread{
    final Runnable onStopTask;
    public MyThread(Runnable onStopTask) {
        this.onStopTask = onStopTask;
        start();
    }
    @Override
    public void run() {
        System.out.println("Start thread");
        try {
            System.out.println("Do something ...");
            sleep(5000);
        } catch (Exception e) {
        }
        Platform.runLater(onStopTask);
        System.out.println("Stop thread\n");
    }
}

Класс приложения:

public class ThreadTest extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Label first = new Label();
            Label second = new Label();
            Button btn = new Button("Action");
            btn.setOnAction(e->{
                first.setText("First");
                new MyThread(()->second.setText("Second"));
            });
            VBox root = new VBox(20.0, btn, first, second);
            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}
READ ALSO
ViewPager + fragment stack

ViewPager + fragment stack

Проблема: мне нужно из фрагмента C вернуться на AКогда я это делаю, то фрагмент A инициализируется(все методы жизненого цикла отрабатывают),...

135
Найти последовательность букв в строке java

Найти последовательность букв в строке java

Задание: нужно проверить, содержится ли в первой строке вторая строка и вывести "Содержится" или "Не содержится"Использовать стандартные...

250
Хочу учиться Android разработке

Хочу учиться Android разработке

Собираюсь делать это через Intellij IDEA (тк

83
Добавление элементов в ChoiceBox

Добавление элементов в ChoiceBox

Как добавить элементы в ChoiceBox в самом fxml файле?

80