Javafx 2 如何维护GridPane';动态添加元素后的固定大小

Javafx 2 如何维护GridPane';动态添加元素后的固定大小,javafx-2,javafx-8,fxml,Javafx 2,Javafx 8,Fxml,我需要创建可以动态更改的棋盘游戏。 其尺寸可以是5x5、6x6、7x7或8x8 我将JavaFX与NetBeans和场景生成器一起用于GUI 当用户选择大于5x5的电路板尺寸时,会发生这种情况: 这是动态添加单元之前场景生成器上的模板: 我向GridPane中的每个单元格添加StackPane+单元格编号标签: @FXML GridPane boardGame; public void CreateBoard() { int boardSize = m_Engine.

我需要创建可以动态更改的棋盘游戏。
其尺寸可以是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();
    }
@FXML
网格棋盘游戏;
公共电路板()
{
int boardSize=m_Engine.GetBoard().GetBoardSize();
int num=boardSize*boardSize;
int maxColumns=m_Engine.GetNumOfCols();
int maxRows=m_Engine.GetNumOfRows();
对于(int row=0;row=0;col--)
{
StackPane StackPane=新的StackPane();
stackPane.setPrefSize(150.0200.0);
stackPane.getChildren().add(新标签(String.valueOf(num)));
添加(堆栈窗格、列、行);
num--;
}
}
boardGame.setGridLinesVisible(true);
boardGame.autosize();
}
问题是网格窗格上堆栈窗格的大小正在变小。
我试着将它们的最小尺寸和最大尺寸设置为相等,但这无助于它们仍然变小

我在网上搜索过,但没有找到和我一样的问题。
这里发现了唯一与我类似的问题:

但他的建议是使用TilePane,而我需要使用GridPane,因为这是一个棋盘游戏,当我需要执行任务时,使用GridPane更容易,例如,在row=1和column=2上访问单元格

编辑:
我从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);
        }
    }
@FXML
网格棋盘游戏;
公共电路板()
{
int boardSize=m_Engine.GetBoard().GetBoardSize();
int num=boardSize*boardSize;
int maxColumns=m_Engine.GetNumOfCols();
int maxRows=m_Engine.GetNumOfRows();
boardGame=新建网格窗格();
棋盘游戏。设置对齐(位置中心);
集合堆栈窗格=新的ArrayList();
对于(int row=0;row=0;col--)
{
StackPane StackPane=新的StackPane();
stackPane.setPrefSize(150.0200.0);
stackPane.getChildren().add(新标签(String.valueOf(num)));
添加(堆栈窗格、列、行);
stackPanes.add(stackPane);
num--;
}
}
这个.buildGridPane(boardSize);
boardGame.setGridLinesVisible(true);
boardGame.autosize();
boardGamePane.getChildren().addAll(stackPanes);
}
公共void buildGridPane(int i_numorrowsandColumns)
{
行约束行约束;
柱约束柱约束;
对于(int index=0;index
通过注释中的解释对代码进行了轻微更改。嗯

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

            // To occupy fixed space set the max and min size of
            // stackpanes. 
            // stackPane.setPrefSize(150.0, 200.0);
            stackPane.setMaxSize(100.0, 100.0);
            stackPane.setMinSize(100.0, 100.0);

            stackPane.getChildren().add(new Label(String.valueOf(num)));
            boardGame.add(stackPane, col, row);

            stackPanes.add(stackPane);
            num--;
        }
   }
   // No need to add column and row constraints if you want just a uniform 
   // rigid grid view. So commented the line below.

   // this.buildGridPane(boardSize);
   boardGame.setGridLinesVisible(true);
   boardGame.autosize();

   // Here you are adding all stackpanes, those are added to the gridpane 'boardGame' 
   // before, to the another gridpane with name 'boardGamePane'. So all stackpanes are moved
   // to this second gridpane. This is the reason of blank board you are seeing.
   // So commenting this out also.

   // boardGamePane.getChildren().addAll(stackPanes);
}
GridPane棋盘游戏;
公共电路板()
{
int boardSize=m_Engine.GetBoard().GetBoardSize();
int num=boardSize*boardSize;
int maxColumns=m_Engine.GetNumOfCols();
int maxRows=m_Engine.GetNumOfRows();
boardGame=新建网格窗格();
棋盘游戏。设置对齐(位置中心);
集合堆栈窗格=新的ArrayList();
对于(int row=0;row=0;col--)
{
StackPane StackPane=新的StackPane();
//要占用固定空间,请设置
//堆叠窗格。
//stackPane.setPrefSize(150.0200.0);
stackPane.setMaxSize(100.0,100.0);
stackPane.setMinSize(100.0,100.0);
stackPane.getChildren().add(新标签(String.valueOf(num)));
添加(堆栈窗格、列、行);
stackPanes.add(stackPane);
num--;
}
}
//如果只需要一个统一的文件,则无需添加列和行约束
//刚性网格视图。下面这行注释如下。
//这个.buildGridPane(boardSize);
boardGame.setGridLinesVisible(true);
boardGame.autosize();
//在这里,您将添加所有StackPane,它们将添加到gridpane“boardGame”
//之前,移动到另一个名为“boardGamePane”的gridpane。因此,所有StackPane都将被移动
//到第二个网格窗格。这就是您看到空白板的原因。
//因此,也要对此进行评论。
//boardGamePane.getChildren().addAll(stackPanes);
}

尝试使用stackpane.setMaxSize(150.0、200.0)冻结stackpane的大小;和stackPane.setMinSize(150.0200.0)@Uluk Bily,我试过了,但是没有用设置标签大小来代替stackpanethanks。我记下了你的答案,虽然还不完全清楚。除了您的代码之外,我还在函数末尾添加了:boardGamePane.getChildren().add(boardGame);现在它工作得很好。我只需要将其加载到当前主窗格。