显示后台任务的进度(Showing the Progress of a Background Task)

编程入门 行业动态 更新时间:2024-10-20 20:44:14
显示后台任务的进度(Showing the Progress of a Background Task)

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

@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应用程序线程异常..

Exception in thread "Thread-6" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-6 Exception in thread "Thread-6" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-6并指向Task线程内的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。

Hi i want to show the progress of a background task.

@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(); }

And below code is the progress popup i have used in my application.

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(); }

The problem is when i run the app , No FX app thread exception occuring..

Exception in thread "Thread-6" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-6 and pointing at void call() method inside Task thread. Is there any solution for it..

James_D solution Actually works for me.But i got to change the code to this.

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();

After changing the code again progress not showing.just followed @james_D anwser.

最满意答案

您正在获取异常,因为您正在从后台线程更新UI。 您需要从FX应用程序线程更新UI。 如果你需要在call()方法执行期间进行增量更新,或者(在这种情况下似乎:我不确定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(); }

You are getting the exception because you are updating the UI from a background thread. You need to update the UI from the FX Application Thread. You can do this with a call to Platform.runLater() if you need to make incremental updates during your call() method execution, or (as it seems in this case: I'm not sure exactly what the loadScreen and setScreen methods do, but I am assuming they do not change the existing scene graph) if you only need to update the UI once the task is complete, update the UI in the succeeded method of the task:

@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(); }

更多推荐

本文发布于:2023-08-06 22:51:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1456622.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进度   后台   Showing   Task   Background

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!