嗨,我想显示后台任务的进度。
@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(); }更多推荐
发布评论