Непосредственно обновить состояние кнопки JavaFX - PullRequest
0 голосов
/ 01 октября 2019

У меня есть графический интерфейс, который загружает кучу настроек через последовательный порт после нажатия кнопки «Загрузить».

Эта загрузка занимает некоторое время и содержит некоторые потоки Thread.sleep, поэтому во время загрузки графический интерфейс пользователя зависает, но все же позволяет пользователю еще несколько раз нажать кнопку загрузки, что приводит к еще большему замораживанию.

Как лучше всего напрямую отключить кнопку загрузки, загрузить в фоновом режиме и включить кнопку после завершения?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Спасибо за ответ.

Чтобы ответить на свой вопрос, я уже нашел простое решение, создав задачу:

public class uploadTask extends Task<String> {
  @Override
  protected String call() throws Exception {
  }
}
0 голосов
/ 01 октября 2019

Я бы рекомендовал использовать RxJavaFx .

    import java.util.concurrent.TimeUnit;

    import io.reactivex.Observable;
    import io.reactivex.rxjavafx.observables.JavaFxObservable;
    import io.reactivex.rxjavafx.schedulers.JavaFxScheduler;
    import io.reactivex.schedulers.Schedulers;
    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;

    public class BackgroundTaskButtonApp extends Application {

        public static void main(String[] args) {
            launch(args);
        }

        @Override
        public void start(Stage stage) throws Exception {
            Button button = new Button("Run!");
            StackPane stackPane = new StackPane(button);

            Scene scene = new Scene(stackPane, 400, 400);
            stage.setScene(scene);
            stage.show();

            JavaFxObservable.actionEventsOf(button)
            .doOnNext(event -> button.setDisable(true))
            .switchMap(event -> Observable.just(event).observeOn(Schedulers.single()).doOnNext(e -> runLongTask()))
            .observeOn(JavaFxScheduler.platform())
            .doOnNext(event -> button.setDisable(false))
            .subscribe();
        }

        private void runLongTask() {
            System.out.println(Thread.currentThread().getName() + " runLongTask()");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...