JavaFX 显示用于较长操作的加载对话框
JavaFX show loading dialog for longer operations
我在 Controller class 中进行了一些操作,这可能需要一些时间。所以我想在这个操作 运行ning 时显示一个加载对话框。
我试过这个:
Platform.runLater(new Runnable() {
@Override
public void run() {
loadingDialog.show();
}
});
Boolean opSuccess = myService.operate();
Platform.runLater(new Runnable() {
@Override
public void run() {
loadingDialog.hide();
}
});
if (opSuccess) {
// continue
}
现在,问题是,loadingDialog 永远不会显示。 UI 只会阻塞一段时间,然后继续“//continue”。
这么看来,运行后面的调用被阻塞操作(operate)阻塞了?
我还尝试了 CoundDownLatch,等待 loadingDialog.show() 完成,然后 运行ning myService.operate()。但是 latch.await() 方法永远不会完成。
所以我的问题是,在 myService.operate() 完成并返回 true 或 false 之前,我如何显示 loadingDialog?我是否必须将 operate() 调用放入另一个线程并 运行 它是异步的还是有更简单的方法?
感谢您的帮助。
您确定您的整个代码没有 运行 在 JavaFX 线程中吗?
你的控制器的方法 class 通常是这样的,我根据你的描述假设它。
但是,最好使用 Task class. Here 您会找到适用于您的应用程序的教程和简短代码段:
// here runs the JavaFX thread
// Boolean as generic parameter since you want to return it
Task<Boolean> task = new Task<Boolean>() {
@Override public Boolean call() {
// do your operation in here
return myService.operate();
}
};
task.setOnRunning((e) -> loadingDialog.show());
task.setOnSucceeded((e) -> {
loadingDialog.hide();
Boolean returnValue = task.get();
// process return value again in JavaFX thread
});
task.setOnFailed((e) -> {
// eventual error handling by catching exceptions from task.get()
});
new Thread(task).start();
我假设 Java 8 和使用 Lambda 表达式的可能性。当然没有他们也是可以的。
您最好在 JavaFx - 任务和服务中使用并发 mechanisms/Worker 接口,而不是使用 Platform.runLater()。任务和服务允许您在单独的线程中管理长 运行 任务。他们还提供回调以指示任务的进度。
您可以在 http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
进一步探索
另请查看任务和服务的 Ensemble JavaFX 示例 - http://www.oracle.com/technetwork/java/javase/overview/javafx-samples-2158687.html
我在 Controller class 中进行了一些操作,这可能需要一些时间。所以我想在这个操作 运行ning 时显示一个加载对话框。
我试过这个:
Platform.runLater(new Runnable() {
@Override
public void run() {
loadingDialog.show();
}
});
Boolean opSuccess = myService.operate();
Platform.runLater(new Runnable() {
@Override
public void run() {
loadingDialog.hide();
}
});
if (opSuccess) {
// continue
}
现在,问题是,loadingDialog 永远不会显示。 UI 只会阻塞一段时间,然后继续“//continue”。
这么看来,运行后面的调用被阻塞操作(operate)阻塞了?
我还尝试了 CoundDownLatch,等待 loadingDialog.show() 完成,然后 运行ning myService.operate()。但是 latch.await() 方法永远不会完成。
所以我的问题是,在 myService.operate() 完成并返回 true 或 false 之前,我如何显示 loadingDialog?我是否必须将 operate() 调用放入另一个线程并 运行 它是异步的还是有更简单的方法?
感谢您的帮助。
您确定您的整个代码没有 运行 在 JavaFX 线程中吗? 你的控制器的方法 class 通常是这样的,我根据你的描述假设它。
但是,最好使用 Task class. Here 您会找到适用于您的应用程序的教程和简短代码段:
// here runs the JavaFX thread
// Boolean as generic parameter since you want to return it
Task<Boolean> task = new Task<Boolean>() {
@Override public Boolean call() {
// do your operation in here
return myService.operate();
}
};
task.setOnRunning((e) -> loadingDialog.show());
task.setOnSucceeded((e) -> {
loadingDialog.hide();
Boolean returnValue = task.get();
// process return value again in JavaFX thread
});
task.setOnFailed((e) -> {
// eventual error handling by catching exceptions from task.get()
});
new Thread(task).start();
我假设 Java 8 和使用 Lambda 表达式的可能性。当然没有他们也是可以的。
您最好在 JavaFx - 任务和服务中使用并发 mechanisms/Worker 接口,而不是使用 Platform.runLater()。任务和服务允许您在单独的线程中管理长 运行 任务。他们还提供回调以指示任务的进度。
您可以在 http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
进一步探索另请查看任务和服务的 Ensemble JavaFX 示例 - http://www.oracle.com/technetwork/java/javase/overview/javafx-samples-2158687.html