GlassPane中的图层布局无法按预期工作

时间:2016-04-03 21:58:09

标签: javafx gluon gluon-mobile

我在GlassPane中安装了一个图层:

MobileApplication.getInstance().getGlassPane().getLayers().add(myLayer);

现在我希望myLayer的内容可以在glassPane的中心分配,就像我在View添加图层时一样:

view.getLayers().add(myLayer)

虽然对齐设置为居中,但我得到以下结果:

enter image description here

我注意到添加到glassPane的图层的layoutBounds是" 0",而视图中图层的layoutBounds与视图layoutBounds相同。

此外,我不需要按照胶子文档中的说明调用layer.show()("然后通过调用show()显示一个图层,...") ,因为图层在添加到图层后会立即显示。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我建议您查看详细文档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,并且您不必担心这些更低级别的细节。