如何让图像在 VBox 中相互重叠

How to have images overlap each other in a VBox

我正在使用 Scene Builder 创建我的场景,我已将卡片 (ImageViews) 添加到 VBox,但所有 12 张卡片似乎都不太适合,尽管它们确实适合我的 HBox。我找不到任何 属性 可以让我减少 VBox 内节点之间的间距。我已经展示了一张我的 VBox 外观的图片,还有一张我的 HBox 的图片(这就是我想要的样子)。如果那不可能,那么我希望能够重叠图像,使它们适合。

VBox 不支持(至少我不知道会那样做)。

但是,如果内容不适合,您可以覆盖 layoutChildren 以向上移动节点,并将 computeMinHeight 覆盖为 return 最小高度值的最大值:

public class OverlappingVBox extends VBox {

    @Override
    protected void layoutChildren() {
        super.layoutChildren();

        List<Node> managed = getManagedChildren();

        int count = managed.size();
        if (count == 0) {
            return;
        }

        double contentAreaMaxY = getHeight() - getInsets().getBottom();

        Node lastNode = managed.get(managed.size() - 1);
        double maxY = lastNode.getLayoutY() + lastNode.getLayoutBounds().getMaxY();

        if (contentAreaMaxY < maxY) {
            // reduce layoutY if content does not fit
            double gap = (contentAreaMaxY - maxY) / (count - 1);
            for (int i = 1; i < count; i++) {
                Node n = managed.get(i);
                n.setLayoutY(n.getLayoutY() + i * gap);
            }
        }

    }

    @Override
    protected double computeMinHeight(double width) {
        // min height = max min height
        double result = 0;
        Insets insets = getInsets();
        double contentWidth = width - insets.getLeft() - insets.getRight();
        for (Node n : getManagedChildren()) {
            double mH = n.minHeight(contentWidth);
            if (mH > result) {
                result = mH;
            }
        }
        return result + insets.getTop() + insets.getBottom();
    }

}

使用示例

@Override
public void start(Stage primaryStage) {
    OverlappingVBox root = new OverlappingVBox();

    Color c = Color.WHITE;

    for (int i = 0; i < 10; i++) {
        root.getChildren().add(new Rectangle(50, 50, c));
        c = c.invert();
    }

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}