嗨,我想显示后台任务的进度。
@FXML
private void addOfficeBarrierSelect() {
App.getInstance().showProgressIndicator(myController);
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
ScreensController colllectScreenController = new ScreensController();
colllectScreenController.loadScreen(Screens.ADD_OFFICE_BARRIER);
colllectScreenController.setScreen(Screens.ADD_OFFICE_BARRIER);
content.setContent(null);
content.setContent(colllectScreenController);
return null;
}
@Override
protected void succeeded() {
App.getInstance().hideProgressIndicator(myController);
}
@Override
protected void failed() {
super.failed();
App.getInstance().hideProgressIndicator(myController);
}
};
new Thread(task).start();
}
下面的代码是我在应用程序中使用的进度弹出窗口。
public void showProgressIndicator(ScreensController myController) {
myController.setDisable(true);
if (popupProgressIndicator == null) {
JFXSpinner spinner = new JFXSpinner();
spinner.setLayoutX(0);
spinner.setLayoutY(0);
spinner.setPrefHeight(200);
spinner.setPrefWidth(200);
popupProgressIndicator = new Popup();
popupProgressIndicator.getContent().add(spinner);
}
if (!popupProgressIndicator.isShowing()) {
popupProgressIndicator.show(primaryStage);
popupProgressIndicator.centerOnScreen();
}
}
public void hideProgressIndicator(ScreensController myController) {
myController.setDisable(false);
if (popupProgressIndicator.isShowing())
popupProgressIndicator.hide();
}
问题是当我运行应用程序时,没有发生 FX 应用程序线程异常..
线程“Thread-6”中出现异常 java.lang.IllegalStateException:不在 FX 应用程序线程上; currentThread = Thread-6
并指向任务线程内的 void call() 方法。
有什么解决办法吗..
James_D
解决方案实际上对我有用。但我必须将代码更改为此。
showProgressIndicator(myController);
Task<FXMLLoader> task = new Task<FXMLLoader>() {
@Override
protected FXMLLoader call() throws Exception {
FXMLLoader loader = new FXMLLoader(App.class.getResource(Screens.ADD_MEMBER));
return loader;
}
@Override
protected void succeeded() {
super.succeeded();
hideProgressIndicator(myController);
}
@Override
protected void failed() {
super.failed();
hideProgressIndicator(myController);
}
};
new Thread(task).start();
再次更改代码后,进度未显示。只是关注@james_D anwser。
最佳答案
您收到异常是因为您正在从后台线程更新 UI。您需要从 FX 应用程序线程更新 UI。如果您需要在 call()
方法执行期间进行增量更新,或者(如本例所示),您可以通过调用 Platform.runLater()
来完成此操作:我不确定 loadScreen
和 setScreen
方法的具体作用,但我假设它们不会更改现有场景图)(如果您只需要更新 UI)任务完成后,在任务的 succeeded
方法中更新 UI:
@FXML
private void addOfficeBarrierSelect() {
App.getInstance().showProgressIndicator(myController);
Task<ScreensController> task = new Task<Void>() {
@Override
protected ScreensController call() throws Exception {
ScreensController colllectScreenController = new ScreensController();
colllectScreenController.loadScreen(Screens.ADD_OFFICE_BARRIER);
colllectScreenController.setScreen(Screens.ADD_OFFICE_BARRIER);
return colllectScreenController;
}
@Override
protected void succeeded() {
super.succeeded();
content.setContent(getValue());
App.getInstance().hideProgressIndicator(myController);
}
@Override
protected void failed() {
super.failed();
App.getInstance().hideProgressIndicator(myController);
}
};
new Thread(task).start();
}
关于java - 显示后台任务的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37467138/