当我尝试从JSON加载一些文件时,我想创建一个进度条,将屏幕遮住几秒钟。从JSON加载,进度条工作唯一的问题是面纱。
所以,我的应用程序正在运行,当我尝试加载JSON文件时,我尝试使用舞台的进度条设置场景。到目前为止所有的事情都很顺利(即使是新的场景显示了进度条)。问题来自我进度条完成进度(100%)它显示空白...并且没有向我显示旧的应用程序场景。我该如何解决这个问题?
这是我在进度加载器中的代码:
public Scene createContent() {
final StackPane g = new StackPane();
Region veil = new Region();
veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");
veil.setOpacity(0.8);
final ProgressIndicator p1 = new ProgressIndicator();
p1.setPrefSize(100, 100);
p1.setMaxSize(150, 150);
p1.progressProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue ov, Number oldVal, Number newVal) {
if (p1.getProgress() < 0.25) {
p1.setStyle("-fx-progress-color: red;");
} else if (p1.getProgress() < 0.5) {
p1.setStyle("-fx-progress-color: orange;");
} else {
p1.setStyle("-fx-progress-color: green;");
}
}
});
// animate the styled ProgressIndicator
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.setAutoReverse(true);
final KeyValue kv = new KeyValue(p1.progressProperty(), 1);
final KeyFrame kf1 = new KeyFrame(Duration.millis(3000), kv);
timeline.getKeyFrames().add(kf1);
g.getChildren().addAll(veil,p1);
g.setAlignment(Pos.CENTER);
Task task = new Task() {
@Override
protected Object call() throws Exception {
for (int i = 0; i < 500; i++) {
updateProgress(i, 500);
Thread.sleep(5);
}
stage.hide();
return null;
}
};
p1.progressProperty().bind(task.progressProperty());
veil.visibleProperty().bind(task.runningProperty());
p1.visibleProperty().bind(task.runningProperty());
new Thread(task).start();
Scene scene = new Scene(g, 200, 200);
return scene;
}
public void play() {
timeline.play();
}
public void stop() {
timeline.stop();
}
public void start(Stage stage) {
this.stage=stage;
this.stage.setScene(createContent());
this.stage.show();
}
这是在JSON加载器类中:
ProgressLoader pl=new ProgressLoader();
pl.start(VisualAppFactory.getStage());
答案 0 :(得分:1)
我不知道你想要实现什么,以及“面纱”是什么意思,但你的问题肯定来自调用 stage.hide()
而没有开启FX-Thread 。查看方法的文档或使用try块
try {
stage.hide();
} catch (Exception e) {
e.printStackTrace();
}
看效果。
使用Platform.runLater
在FX-Thread上执行调用:
Platform.runLater(()-> stage.hide());
使用task.setOnSucceeded(...)
,您会在任务完成时收到通知,以便将旧视图设置为舞台或其他内容。