JavaFx 自定义警报阶段
JavaFx custom alert stage
我正在尝试创建一个自定义警报,它将向用户显示一条消息,直到它完成任务 (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();
}
}
您需要在后台线程上执行长时间运行的操作,并在操作完成时进行更新。
最简单的方法是为此使用 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 应用程序线程上进行中间更新的功能,并允许您注册处理程序来处理该线程上的不同结果。
我正在尝试创建一个自定义警报,它将向用户显示一条消息,直到它完成任务 (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();
}
}
您需要在后台线程上执行长时间运行的操作,并在操作完成时进行更新。
最简单的方法是为此使用 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 应用程序线程上进行中间更新的功能,并允许您注册处理程序来处理该线程上的不同结果。