gpt4 book ai didi

java - 显示后台任务的进度

转载 作者:行者123 更新时间:2023-12-01 09:53:10 25 4
gpt4 key购买 nike

嗨,我想显示后台任务的进度。

@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() 来完成此操作:我不确定 loadScreensetScreen 方法的具体作用,但我假设它们不会更改现有场景图)(如果您只需要更新 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com