我正在尝试创建一个自定义警报,该警报将向用户显示一条消息,直到完成任务为止(doOperation()) 然后我将关闭自定义的警报并继续该过程。但是它不能正常工作。它阻塞了Fx线程 但不会在屏幕上显示舞台,然后立即关闭。下面的代码中我缺少什么?
class MyClass{
void doOperation(){
//fetch data from DB. Nothing fancy. Simply getting data from jdbc and processes the data which may take a few secs.
}
void fetchProcessData(){
Stage customStage = new Stage();
GridPane stageGrid = new GridPane();
stageGrid.setAlignment(Pos.CENTER);
stageGrid.setHgap(10);
stageGrid.setVgap(10);
Label contextLabel = new Label("Wait...");
stageGrid.add(contextLabel, 0, 1);
Scene scene = new Scene(stageGrid, 300, 150);
customStage.setScene(scene);
customStage.setTitle(title);
customStage.initStyle(stageStyle);
customStage.initModality(modality);
customStage.show();
try {
doOperation();
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
customStage.close();
}
}
答案 0 :(得分:0)
您需要在后台线程上执行长时间运行的操作,并在操作完成后进行更新。
最简单的方法是为此使用Platform.runLater
:
customStage.show();
new Thread(new Runnable() {
@Override
public void run() {
try {
doOperation();
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// close stage on javafx application thread
Platform.runLater(new Runnable() {
@Override
public void run() {
customStage.close();
}
});
}
}).start();
Task
class提供了一些功能,可以在javafx应用程序线程上进行中间更新,并允许您注册在该线程上处理不同结果的处理程序。