GlassPane 中的图层布局未按预期工作
Layout of Layer in GlassPane not working as expected
我在 GlassPane
中安装了一个这样的层:
MobileApplication.getInstance().getGlassPane().getLayers().add(myLayer);
现在我希望 myLayer 的内容在 glassPane 的中心对齐,就像我向 View
添加图层时那样:
view.getLayers().add(myLayer)
虽然对齐设置为居中,但我得到以下结果:
我注意到添加到 glassPane 的层的 layoutBounds 都是“0”,而视图中的层的 layoutBounds 与视图 layoutBounds 相同。
此外,我不需要像 gluon 文档 ("Showing a Layer is then achieved either by calling show(), ...") 中所述那样调用 layer.show()
,因为该层在添加到层后会立即显示。
我是不是漏掉了什么?
我建议您查看详细文档 here,而不仅仅是 JavaDoc。
在那里您会找到有关如何添加和创建图层的更详细说明。
首选方法是使用 addLayerFactory()
,例如:
@Override
public void init() {
addViewFactory(BASIC_VIEW, () -> new BasicView(BASIC_VIEW));
addLayerFactory("My Layer", () -> new SidePopupView(new StackPane(new Button("Side"))));
}
该图层将被隐藏,除非您使用 MobileApplication.getInstance().showLayer("My Layer")
显示它。
您可以创建自己的 Layer
实现,例如:
private class MyLayer extends Layer {
private final Node root;
private final double size = 150;
public MyLayer() {
root = new StackPane(new Button("A custom layer"));
root.setStyle("-fx-background-color: white;");
getChildren().add(root);
getGlassPane().getLayers().add(this);
}
@Override
public void layoutChildren() {
root.setVisible(isShowing());
if (!isShowing()) {
return;
}
root.resize(size, size);
resizeRelocate((getGlassPane().getWidth() - size)/2, (getGlassPane().getHeight()- size)/2, size, size);
}
}
并将其也添加到工厂:
addLayerFactory("My Layer", () -> new MyLayer());
但请注意,您必须调整它的大小并重新定位它,否则您将获得图片中的 0,0 位置,并注意它的可见性。
或者您可以使用内置图层,例如 SidePopupView
,您无需担心这些更底层的细节。
我在 GlassPane
中安装了一个这样的层:
MobileApplication.getInstance().getGlassPane().getLayers().add(myLayer);
现在我希望 myLayer 的内容在 glassPane 的中心对齐,就像我向 View
添加图层时那样:
view.getLayers().add(myLayer)
虽然对齐设置为居中,但我得到以下结果:
我注意到添加到 glassPane 的层的 layoutBounds 都是“0”,而视图中的层的 layoutBounds 与视图 layoutBounds 相同。
此外,我不需要像 gluon 文档 ("Showing a Layer is then achieved either by calling show(), ...") 中所述那样调用 layer.show()
,因为该层在添加到层后会立即显示。
我是不是漏掉了什么?
我建议您查看详细文档 here,而不仅仅是 JavaDoc。
在那里您会找到有关如何添加和创建图层的更详细说明。
首选方法是使用 addLayerFactory()
,例如:
@Override
public void init() {
addViewFactory(BASIC_VIEW, () -> new BasicView(BASIC_VIEW));
addLayerFactory("My Layer", () -> new SidePopupView(new StackPane(new Button("Side"))));
}
该图层将被隐藏,除非您使用 MobileApplication.getInstance().showLayer("My Layer")
显示它。
您可以创建自己的 Layer
实现,例如:
private class MyLayer extends Layer {
private final Node root;
private final double size = 150;
public MyLayer() {
root = new StackPane(new Button("A custom layer"));
root.setStyle("-fx-background-color: white;");
getChildren().add(root);
getGlassPane().getLayers().add(this);
}
@Override
public void layoutChildren() {
root.setVisible(isShowing());
if (!isShowing()) {
return;
}
root.resize(size, size);
resizeRelocate((getGlassPane().getWidth() - size)/2, (getGlassPane().getHeight()- size)/2, size, size);
}
}
并将其也添加到工厂:
addLayerFactory("My Layer", () -> new MyLayer());
但请注意,您必须调整它的大小并重新定位它,否则您将获得图片中的 0,0 位置,并注意它的可见性。
或者您可以使用内置图层,例如 SidePopupView
,您无需担心这些更底层的细节。