我有一个加载所有后端请求的gif。在Charm 5.0.0之前,它工作正常,加载gif会显示,后端将完成它所需的,然后加载GIF将被隐藏。现在,加载gif显示但它没有隐藏。
addLayerFactory(LOADING_GIF, () -> new Layer() {
private final Node root;
private final double sizeX = getGlassPane().getWidth();
private final double sizeY = getGlassPane().getHeight();
{
ProgressIndicator loading = new ProgressIndicator();
loading.setRadius(50);
loading.setStyle("-fx-text-fill:white");
root = new StackPane(loading);
root.setStyle("-fx-background-color: rgba(0,0,0,0);");
getChildren().add(root);
this.setStyle("-fx-background-color:rgba(255,255,255,0.7)");
this.setShowTransitionFactory(v -> {
FadeInTransition ft = new FadeInTransition(v);
ft.setRate(2);
return ft;
});
}
@Override
public void show() {
this.setBackgroundFade(0.0);
super.show();
Layer pane = this;
Task<Integer> task = new Task<Integer>() {
@Override
protected Integer call() throws Exception {
int iterations = 0;
int max = DataService.readOutTime / 1000;
while (iterations <= max) {
Thread.sleep(1000);
iterations++;
}
Platform.runLater(new Runnable() {
@Override
public void run() {
if (pane.isVisible()) {
pane.setShowTransitionFactory(v -> {
FadeOutTransition ft = new FadeOutTransition(v);
ft.setRate(2);
return ft;
});
pane.hide();
MobileApplication.getInstance().showMessage("There was an error in sending your data.");
}
}
});
return iterations;
}
};
Thread thread = new Thread(task);
thread.start();
}
@Override
public void hide() {
this.setBackgroundFade(0.0);
super.hide();
}
@Override
public void layoutChildren() {
root.setVisible(isShowing());
if (!isShowing()) {
return;
}
root.resize(sizeX, sizeY);
resizeRelocate((getGlassPane().getWidth() - sizeX) / 2, (getGlassPane().getHeight() - sizeY) / 2, sizeX, sizeY);
}
});
我有几个显示和隐藏加载程序的实用程序方法:
public void showLoader() {
MobileApplication.getInstance().showLayer(App.LOADING_GIF);
}
public void hideLoader() {
MobileApplication.getInstance().hideLayer(App.LOADING_GIF);
}
有趣的是,我创建的自定义超时(以便在后端存在停顿时隐藏加载程序)也不会隐藏该层。
答案 0 :(得分:0)
您的代码存在问题:您已覆盖Layer::layoutChildren
,但未致电super.layoutChildren()
。
如果您查看JavaDoc:
重写此方法以添加图层的布局逻辑。应注意在覆盖方法中调用此方法以使图层正常运行。
这意味着您正在摆脱图层控件的一些重要部分,例如动画,事件和可见性控制。
这应该有效:
@Override
public void layoutChildren() {
super.layoutChildren();
root.setVisible(isShowing());
if (!isShowing()) {
return;
}
root.resize(sizeX, sizeY);
resizeRelocate(getGlassPane().getWidth() - sizeX) / 2, getGlassPane().getHeight() - sizeY) / 2, sizeX, sizeY);
}
另外,对于隐藏转换,您应该使用setHideTransitionFactory
。
答案 1 :(得分:0)
这就是我为解决此问题所做的事情。在hide()
方法的Gluon文档中:
如果显示此层,则调用此方法将其隐藏。如果存在隐藏过渡,则在隐藏图层之前将其播放。 只有在LifecycleEvent.SHOWN被触发后,才应注意调用此函数。
因此,我意识到来自后端的响应是在完全显示该层之前出现的。因此,我修改了覆盖的hide()
方法,如下所示:
@Override
public void hide() {
if (this.isShowing()) {
this.setOnShown(e -> {
this.setBackgroundFade(0.0);
super.hide();
});
} else {
super.hide();
}
}
因此,如果在被告知隐藏时该层仍处于LifecycleEvent.SHOWING模式,请确保在显示该层时将其隐藏。否则它已经显示出来了,请将其隐藏。