java - 方形单元格的方形 GridPane

标签 java layout javafx gridpane

我的目标是创建一个可调整大小、始终为正方形并包含相同数量的行和列的 GridView,使其单元格也为正方形,类似于黑白棋或国际象棋棋盘。

这是一个小插图,网格在内容 Pane 中水平居中。

enter image description here

我尝试了多种不同的绑定(bind)变体和布局,但我不能完全正确。这是我的 Controller (到目前为止):

public class Controller {

    public HBox contentPane;

    public void initialize() {
        final int sideLength = 10;

        final GridPane gridPane = new GridPane();

        gridPane.setStyle("-fx-border-color: red; -fx-border-insets: 2");

        HBox.setHgrow(gridPane, Priority.ALWAYS);

        for (int i = 0; i < sideLength; i++) {
            final ColumnConstraints columnConstraints = new ColumnConstraints(Control.USE_PREF_SIZE, 10, Double.MAX_VALUE);
            columnConstraints.setHgrow(Priority.ALWAYS);
            gridPane.getColumnConstraints()
                    .add(columnConstraints);

            final RowConstraints rowConstraints = new RowConstraints(Control.USE_PREF_SIZE, 10, Double.MAX_VALUE);
            rowConstraints.setVgrow(Priority.ALWAYS);

            gridPane.getRowConstraints()
                    .add(rowConstraints);
        }

        contentPane.getChildren().add(gridPane);

        for (int i = 0; i < sideLength; i++) {
            for (int j = 0; j < sideLength; j++) {
                final GameCell child = new GameCell();
                GridPane.setRowIndex(child, i);
                GridPane.setColumnIndex(child, j);
                gridPane.getChildren().add(child);
            }
        }
    }
}

单元格本来应该包含形状,但我现在只有Circle来测试它:

public class GameCell extends VBox {

    private final Circle circle;

    public GameCell() {
        circle = new Circle();

        setMinSize(0, 0);
        setPrefSize(Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);
        getChildren().add(circle);

        final ChangeListener<Number> listener = (observable, oldValue, newValue) ->
                circle.setRadius((int) (Math.min(this.getWidth(), this.getHeight()) / 2));

        widthProperty().addListener(listener);
        heightProperty().addListener(listener);
    }
}

这是目前的样子:

enter image description here

最佳答案

通过大量修改解决了这个问题,这是我的解决方案以供将来引用:

游戏单元:

public class GameCell extends Pane {
    public GameCell() {
        final Circle circle = new Circle(10);
        circle.radiusProperty().bind(Bindings.divide(widthProperty(), 4));

        circle.centerXProperty().bind(widthProperty().divide(2));
        circle.centerYProperty().bind(widthProperty().divide(2));

        getChildren().add(circle);
    }
}

游戏面板:

public class GamePane extends HBox {
    public GamePane() {
        final VBox vBox = new VBox();

        vBox.alignmentProperty().set(Pos.CENTER);
        alignmentProperty().set(Pos.CENTER);

        final GridPane gridPane = new GridPane();

        final NumberBinding binding = Bindings.min(widthProperty(), heightProperty());

        gridPane.setMinSize(200, 200);
        vBox.prefWidthProperty().bind(binding);
        vBox.prefHeightProperty().bind(binding);
        vBox.setMaxSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);

        vBox.setFillWidth(true);
        VBox.setVgrow(gridPane, Priority.ALWAYS);

        final int sideLength = 8;
        for (int i = 0; i < sideLength; i++) {
            final ColumnConstraints columnConstraints = new ColumnConstraints(Control.USE_PREF_SIZE, Control.USE_COMPUTED_SIZE, Double.MAX_VALUE);
            columnConstraints.setHgrow(Priority.SOMETIMES);
            gridPane.getColumnConstraints().add(columnConstraints);

            final RowConstraints rowConstraints = new RowConstraints(Control.USE_PREF_SIZE, Control.USE_COMPUTED_SIZE, Double.MAX_VALUE);
            rowConstraints.setVgrow(Priority.SOMETIMES);
            gridPane.getRowConstraints().add(rowConstraints);
        }

        vBox.getChildren().add(gridPane);

        getChildren().add(vBox);

        HBox.setHgrow(this, Priority.ALWAYS);

        for (int i = 0; i < sideLength; i++) {
            for (int j = 0; j < sideLength; j++) {
                final Pane child = new GameCell();

                GridPane.setRowIndex(child, i);
                GridPane.setColumnIndex(child, j);
                gridPane.getChildren().add(child);
            }
        }
    }
}

关于java - 方形单元格的方形 GridPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44979700/

相关文章:

java - Postgresql:在表创建期间分配默认时区

Android ImageButton 分辨率问题

WebView 中的 Java Applet

java - 无法添加任务 ':jacocoTestReport',因为同名任务已存在

java - 在 JavaFX 中获取当前阶段的 GraphicsDevice

java - PE header 要求

ruby-on-rails - 缺少 Rails 主要布局

jquery - 在不改变页面布局的情况下淡入淡出元素

JavaFX 获取单个调整大小事件

css - 类名的 JavaFX 样式