如何将CURSOR更改为忙碌并防止用户单击

时间:2018-08-27 06:48:51

标签: windows javafx combobox

我的窗口中有三个组合框。这是我正在使用JavaFX和SQLIte开发的家族树应用程序。每个人都有父亲,母亲和配偶信息,可以从ComboBoxes中选择。 ComboBox加载了数据库中的数据。

加载这三个组合框需要一段时间。实际上对于不同的组合框而言,延迟是不同的。

如果我在一个组合框尚未准备好或另一个组合框未准备好时单击它,屏幕将变成白色,直到另一个组合框准备就绪。

我希望在整个窗口准备好接受用户输入之前,禁止用户通过鼠标,键盘和按钮在整个窗口上输入。在此之前,我想将光标更改为STOP之类的内容。

如何执行此操作?有什么建议吗?

谢谢, 霍尼戈德

1 个答案:

答案 0 :(得分:1)

在单独的Task<ObservableList<SomeType>>上运行Task(或Thread返回一些包含多个列表的对象)。在启动线程之前,请禁用根目录并设置场景的光标,当任务完成时,请使用结果初始化GUI并再次重新启用场景:

@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();
}