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

问题描述 投票:-2回答:1

我的窗口里有三个COMBO BOXES。它是我使用JavaFX和SQLIte开发的家族树应用程序。每个人都有父亲,母亲和配偶信息,可以从ComboBoxes中选择。 ComboBoxes加载了来自数据库的数据。

加载这三个组合框需要一段时间。实际上不同的组合框有不同的延迟。

如果我在未准备就绪时单击组合框或其他组合框未就绪,则屏幕将变为白色,直到另一个组合框准备就绪。

我想阻止用户从鼠标,键盘和按钮输入整个窗口,直到整个窗口准备好接受用户的输入。在那之前,我想将光标更改为STOP。

这该怎么做?有什么建议?

谢谢,Hornigold

windows javafx combobox
1个回答
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();
}
© www.soinside.com 2019 - 2024. All rights reserved.