新 window 中的 JavaFX 进度指示器不会 "spin"
JavaFX progress indicator in a new window won't "spin"
我制作了登录屏幕,现在我必须做一些需要大约 8-10 秒的后台工作,我用进度指示器(不确定)制作了新的 window,但它只是弹出并且它是静态的(不旋转),我假设我在线程部分做错了,这里是代码:
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()
方法中完成。
我制作了登录屏幕,现在我必须做一些需要大约 8-10 秒的后台工作,我用进度指示器(不确定)制作了新的 window,但它只是弹出并且它是静态的(不旋转),我假设我在线程部分做错了,这里是代码:
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()
方法中完成。