我制作了登录屏幕,现在我必须做一些后台工作,大约需要 8-10 秒,我制作了带有进度指示器的新窗口(不确定),但它只是弹出并且是静态的(不旋转),我想我'我在线程部分做错了,这里是代码:
Task<Boolean> loginTask = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
return true;
}
};
loginTask.setOnRunning(e -> {
//background task(collecting data)
});
之后我做了这个:
Thread thread = new Thread(loginTask);
thread.setDaemon(true);
thread.start();
//progress indicator window
Parent p = null;
try {
p = FXMLLoader.load(getClass().getResource("/fxml/loginLoader.fxml"));
p.setVisible(true);
Scene scene = new Scene(p);
Stage wndw = new Stage();
this.loadingStage=wndw;
wndw.setTitle("Loading data... Please wait.");
wndw.setScene(scene);
wndw.show();
} catch (IOException ex) {
ex.printStackTrace();
}
它会弹出,但它是静态的:
我需要做什么才能使进度指示器旋转?
最佳答案
您垄断了JavaFX应用程序线程,这意味着它无法更新UI,因此ProgressIndicator
不会产生动画。
Task<Boolean> loginTask = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
return true;
}
};
loginTask.setOnRunning(e -> {
//background task(collecting data)
});
您的评论表明您正在 onRunning
处理程序中执行实际工作,这不是使用 Task
的正确方法。当 Task
进入 RUNNING
状态时,该处理程序在 FX 线程上被调用;它意味着您可以在其中更新 UI 以指示状态更改等回调。任务的实际工作应该在后台线程上调用的 call()
方法中完成。
关于新窗口中的 JavaFX 进度指示器不会 "spin",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557361/