Как изменить CURSOR на занят и предотвратить нажатие пользователем - PullRequest
0 голосов
/ 27 августа 2018

У меня есть три COMBO BOXES в моем окне.Это приложение на основе семейного дерева, которое я разрабатываю с использованием JavaFX и SQLIte.У каждого человека есть информация об отце, матери и супруге, которую можно выбрать в комбинированных списках.ComboBox загружаются с данными из базы данных.

Требуется некоторое время, чтобы загрузить эти три поля со списком.На самом деле разные задержки для разных полей со списком.

Если я нажму на поле со списком, когда оно не готово, или другое поле со списком не готово, экран станет белым, пока не будет готово другое поле со списком.

Я хочу запретить ввод пользователяна все окно от мыши, клавиатуры и кнопок, пока все окно не будет готово принять ввод пользователя.До этого я хочу изменить курсор на что-то вроде STOP.

Как это сделать?Любые предложения?

Спасибо, Hornigold

1 Ответ

0 голосов
/ 27 августа 2018

Запустите Task<ObservableList<SomeType>> (или Task, возвращающий некоторый объект, содержащий более одного списка) в отдельном Thread.Перед запуском потока вы отключаете корень и устанавливаете курсор для сцены, а когда задача заканчивается, вы инициализируете графический интерфейс с результатами и снова включаете сцену:

@Override
public void start(Stage primaryStage) {
    Button loadButton = new Button("load");
    ComboBox<String> combo = new ComboBox<>();
    VBox root = new VBox(combo, loadButton);
    Scene scene = new Scene(root);

    loadButton.setOnAction(evt -> {
        root.setDisable(true);

        // save old cursor to restore after finishing the task
        final Cursor oldCursor = root.getScene().getCursor();
        scene.setCursor(Cursor.WAIT);

        Task<ObservableList<String>> task = new Task<ObservableList<String>>() {

            @Override
            protected ObservableList<String> call() throws Exception {
                ObservableList<String> result = FXCollections.observableArrayList();
                for (int i = 0; i < 100; i++) {
                    result.add(Integer.toString(i));
                }
                // simulate delay
                Thread.sleep(5000);
                return result;
            }
        };
        task.setOnSucceeded(e -> {
            // use results of task in the GUI
            combo.setItems(task.getValue());

            // restore cursor and reenable scene
            root.setDisable(false);
            scene.setCursor(oldCursor);
        });
        task.setOnFailed(e -> {
            // todo: handle exception in Task.call
        });
        Thread thread = new Thread(task);
        thread.start();
    });

    primaryStage.setScene(scene);
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...