我的窗口中有三个组合框。这是我正在使用JavaFX和SQLIte开发的家族树应用程序。每个人都有父亲,母亲和配偶信息,可以从ComboBoxes中选择。 ComboBox加载了数据库中的数据。
加载这三个组合框需要一段时间。实际上对于不同的组合框而言,延迟是不同的。
如果我在一个组合框尚未准备好或另一个组合框未准备好时单击它,屏幕将变成白色,直到另一个组合框准备就绪。
我希望在整个窗口准备好接受用户输入之前,禁止用户通过鼠标,键盘和按钮在整个窗口上输入。在此之前,我想将光标更改为STOP之类的内容。
如何执行此操作?有什么建议吗?
谢谢, 霍尼戈德
答案 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();
}