我的窗口里有三个COMBO BOXES。它是我使用JavaFX和SQLIte开发的家族树应用程序。每个人都有父亲,母亲和配偶信息,可以从ComboBoxes中选择。 ComboBoxes加载了来自数据库的数据。
加载这三个组合框需要一段时间。实际上不同的组合框有不同的延迟。
如果我在未准备就绪时单击组合框或其他组合框未就绪,则屏幕将变为白色,直到另一个组合框准备就绪。
我想阻止用户从鼠标,键盘和按钮输入整个窗口,直到整个窗口准备好接受用户的输入。在那之前,我想将光标更改为STOP。
这该怎么做?有什么建议?
谢谢,Hornigold
在单独的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();
}