【问题标题】:Square GridPane of square cells方形单元格的方形 GridPane
【发布时间】:2017-12-12 06:41:18
【问题描述】:

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

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

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

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);
            }
        }
    }
}

还有那些应该包含 Shapes 的单元格,但我现在只是 Circles 只是为了测试它:

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);
    }
}

这是目前的样子:

【问题讨论】:

    标签: java layout javafx gridpane


    【解决方案1】:

    这为我解决了 GridPane 的平方问题,似乎比原来的答案简单一些。它使用 Kotlin 和 TornadoFX 构建器,但无论哪种方式,要点都应该是可读的。

        val size = doubleProperty(16.0)
        val grid = gridpane {
            maxHeightProperty().bind(size)
            maxWidthProperty().bind(size)
        }
        val root = vbox(alignment = Pos.CENTER) {
            size.bind(Bindings.min(widthProperty(), heightProperty()))
            grid.vgrow = Priority.ALWAYS
            add(grid)
        }
    

    【讨论】:

      【解决方案2】:

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

      游戏单元:

      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);
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 2023-03-12
        • 2018-07-13
        • 2013-11-10
        • 2014-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多