【发布时间】:2014-11-26 13:24:39
【问题描述】:
我试图在 JavaFX 中同时显示两个阶段,其中第一个阶段应该显示一个进度条,并且在第二个阶段准备好显示时应该立即关闭。 我尝试通过 Platform.runLater 和 Tasks 运行,但问题是两个阶段都被冻结,直到两者都完成加载,并且 progessbar 直到第二个才开始动画阶段已完成加载。
这里摘录一些代码:
public void start(Stage primaryStage) throws Exception {
new Thread(progressTask()).start();
new Thread(loginTask()).start();
}
public Task<Void> loginTask() {
Task<Void> t = new Task<Void>() {
@Override
protected Void call() throws Exception {
Platform.runLater(new Runnable() {
@Override
public void run() {
Stage s = new Stage();
FXMLLoader loader = new FXMLLoader(getClass().getResource("Login.fxml"));
Scene sc = null;
try {
sc = new Scene((Parent) loader.load());
} catch (IOException e) {
e.printStackTrace();
}
s.setScene(sc);
s.show();
}
});
return null;
};
};
return t;
}
public Task<Void> progressTask() {
Task<Void> t = new Task<Void>() {
@Override
protected Void call() throws Exception {
Platform.runLater(new Runnable() {
@Override
public void run() {
ProgressBar bar = new ProgressBar(0);
bar.setPrefSize(200, 24);
Timeline task = new Timeline(new KeyFrame(Duration.ZERO, new KeyValue(bar.progressProperty(), 0)), new KeyFrame(
Duration.seconds(5), new KeyValue(bar.progressProperty(), 1)));
VBox layout = new VBox(10);
layout.getChildren().setAll(bar);
Stage stage = new Stage(StageStyle.DECORATED);
stage.setScene(new Scene(layout));
stage.initModality(Modality.WINDOW_MODAL);
stage.show();
new Thread() {
public void run() {
task.playFromStart();
}
}.start();
task.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
stage.close();
}
});
}
});
return null;
}
};
感谢您的帮助。
【问题讨论】:
-
您误解了
Task和Platform.runLater()的作用。看看stackoverflow.com/questions/13784333/… -
如果你想在任务/线程中创建阶段,你必须使用 Platform.runLater,否则你没有在应用程序线程上运行,它将退出。所以我既需要任务又需要 runlater
-
任务是做什么用的?您没有在后台线程中运行任何代码。
-
我正在加载的阶段在其初始化中执行数据库通信。这需要几秒钟的时间来执行,因此应该在后台执行以避免程序冻结并同时显示加载动画。
标签: java user-interface javafx javafx-8