【发布时间】:2014-10-13 17:24:30
【问题描述】:
我需要创建可以动态更改的棋盘游戏。
它的尺寸可以是 5x5、6x6、7x7 或 8x8。
我将 JavaFX 与 NetBeans 和用于 GUI 的场景构建器结合使用。
当用户选择大于 5x5 的板尺寸时,会发生以下情况:
这是动态添加单元格之前场景构建器上的模板:
对于 GridPane 中的每个单元格,我添加 StackPane + 单元格编号标签:
@FXML
GridPane boardGame;
public void CreateBoard()
{
int boardSize = m_Engine.GetBoard().GetBoardSize();
int num = boardSize * boardSize;
int maxColumns = m_Engine.GetNumOfCols();
int maxRows = m_Engine.GetNumOfRows();
for(int row = 0; row < maxRows ; row++)
{
for(int col = maxColumns - 1; col >= 0 ; col--)
{
StackPane stackPane = new StackPane();
stackPane.setPrefSize(150.0, 200.0);
stackPane.getChildren().add(new Label(String.valueOf(num)));
boardGame.add(stackPane, col, row);
num--;
}
}
boardGame.setGridLinesVisible(true);
boardGame.autosize();
}
问题是 GridPane 上的堆栈窗格的大小越来越小。
我尝试将它们设置为相同的最小和最大尺寸,但这并没有帮助它们仍然变得更小。
我在网上搜索,但并没有真正找到与我相同的问题。
唯一与我类似的问题在这里找到:
Dynamically add elements to a fixed-size GridPane in JavaFX
但他的建议是使用 TilePane,而我需要使用 GridPane,因为这是一款棋盘游戏,当我需要执行诸如获取行 = 1 和列 = 2 上的单元格等任务时,使用 GridPane 更容易.
编辑:
我从 FXML 中删除了 GridPane 并在控制器上手动创建了它,但现在它打印了一个空白板:
@FXML
GridPane boardGame;
public void CreateBoard()
{
int boardSize = m_Engine.GetBoard().GetBoardSize();
int num = boardSize * boardSize;
int maxColumns = m_Engine.GetNumOfCols();
int maxRows = m_Engine.GetNumOfRows();
boardGame = new GridPane();
boardGame.setAlignment(Pos.CENTER);
Collection<StackPane> stackPanes = new ArrayList<StackPane>();
for(int row = 0; row < maxRows ; row++)
{
for(int col = maxColumns - 1; col >= 0 ; col--)
{
StackPane stackPane = new StackPane();
stackPane.setPrefSize(150.0, 200.0);
stackPane.getChildren().add(new Label(String.valueOf(num)));
boardGame.add(stackPane, col, row);
stackPanes.add(stackPane);
num--;
}
}
this.buildGridPane(boardSize);
boardGame.setGridLinesVisible(true);
boardGame.autosize();
boardGamePane.getChildren().addAll(stackPanes);
}
public void buildGridPane(int i_NumOfRowsAndColumns)
{
RowConstraints rowConstraint;
ColumnConstraints columnConstraint;
for(int index = 0 ; index < i_NumOfRowsAndColumns; index++)
{
rowConstraint = new RowConstraints(3, Control.USE_COMPUTED_SIZE, Double.POSITIVE_INFINITY, Priority.ALWAYS, VPos.CENTER, true);
boardGame.getRowConstraints().add(rowConstraint);
columnConstraint = new ColumnConstraints(3, Control.USE_COMPUTED_SIZE, Double.POSITIVE_INFINITY, Priority.ALWAYS, HPos.CENTER, true);
boardGame.getColumnConstraints().add(columnConstraint);
}
}
【问题讨论】:
-
尝试使用 stackPane.setMaxSize(150.0, 200.0); 冻结 stackpane 的大小AND stackPane.setMinSize(150.0, 200.0);
-
@Uluk Bily,我试过了,但没有帮助
-
尝试设置标签大小而不是stackpane