2017-07-07 35 views
0

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

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

enter image description here

我已经尝试了不同的结合变和布局的群众,但我不能完全得到它的权利。这里是我的控制器(到目前为止):

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 S表示现在只是测试它:

这是它的外观现在:

enter image description here

回答

0

有很多修修补补的解决了这个问题,这是我以供将来参考的解决方案:

GameCell:

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

GamePane:

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