JavaFX 最大化子节点的大小

JavaFX maximize the size of node children

我想在窗格中添加方块,并将这些方块最大化。

一个方格占据整个窗格。 两个正方形将窗格分开。 三个正方形使它成为三分之一。

当它溢出时,它会转到下一个 "row" 并继续该过程。

所有方块的大小应相同。

有没有办法使用标准布局或我应该修改哪些布局?

谢谢

这是我对这个问题的看法。我不认为这是一个很好的解决方案,但至少它可能有助于指出某些人可能会建立的技术以获得更好的解决方案。基本上,该解决方案会覆盖 layoutChildren() 以随着图块数量或可用 space 的变化重新计算首选图块大小。我不确定 getWidth 或 getHeight 是否真的应该从 layoutChildren 调用(尽管在这种情况下它似乎有效)。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

import java.util.Random;

public class TilePaneSample extends Application {

    private static final Random random = new Random(42);

    @Override
    public void start(Stage stage) {
        TilePane tiles = createTiles();

        VBox layout = new VBox(
                createControls(tiles),
                tiles
        );
        VBox.setVgrow(tiles, Priority.ALWAYS);

        stage.setScene(new Scene(layout, 400, 300));
        stage.show();
    }

    private TilePane createTiles() {
        TilePane tiles = new TilePane() {
            @Override
            protected void layoutChildren() {
                if (getChildren().size() > 0) {
                    setPrefTileWidth(
                            Math.floor(
                                    Math.min(
                                        Math.max(
                                                Tile.MIN_SIZE,
                                                getWidth() / getChildren().size()
                                        ),
                                        getHeight()
                                    )
                            )
                    );
                    setPrefTileHeight(getPrefTileWidth());
                }

                super.layoutChildren();
            }
        };
        tiles.setStyle("-fx-background-color: papayawhip;");
        tiles.setPrefColumns(5);
        tiles.setPrefRows(5);

        tiles.getChildren().add(new Tile());

        return tiles;
    }

    private ToolBar createControls(TilePane tiles) {
        Button addTile = new Button("Add Tile");
        addTile.setOnAction(action -> tiles.getChildren().add(new Tile()));

        Button removeTiles = new Button("Remove Tiles");
        removeTiles.setOnAction(action -> tiles.getChildren().clear());

        ToolBar controls = new ToolBar(addTile, removeTiles);

        controls.setMinHeight(ToolBar.USE_PREF_SIZE);

        return controls;
    }

    private class Tile extends StackPane {
        public static final int MIN_SIZE = 100;

        public Tile() {
            setStyle(
                    "-fx-background-color: " +
                            "rgb(" + random.nextInt(256) + ", " +
                            + random.nextInt(256) + ", "
                            + random.nextInt(256) + ");"
            );

            setMinSize(MIN_SIZE, MIN_SIZE);
        }
    }

    public static void main(String[] args) { launch(args); }
}