2016-04-29 31 views
1

我正在开发一个数独应用程序,但我遇到了阻碍我进步的问题。我想要做的就是制作这个我用循环创建的sudoku板,它将一个标签添加到StackPane中,并且该StackPane进入GridPane的指定位置。所以我试图强制这个委员会有一个规模的规模,并没有超出这一点。JavaFX,无法让GridPane适合BorderPane的中心

我花了整整一个晚上研究和尝试不同的东西,例如把GridPane放到AnchorPane中,并试图将AnchorPane安装在BorderPane的中心,但它总是会超出窗口的外部,当你对于数独板使用太多的行和列。

我想要做的是获得所有板的设置大小,所以如果需要的话,它会被延伸到那一点,或者如果需要它会缩小。附上的图片使用一个带有GridPane的BorderPane放在中间。您可以看到,16x16完美配合,而25x25刚好在窗外。

帮助将不胜感激。

当试图创建25x25时,窗口看起来像什么样子的图片。

http://i.imgur.com/BrJrpiY.png

的窗口外观试图创建一个16×16时喜欢的图片。 这也是使用插入推动它更多的顶部,所以它看起来不太合适。

http://i.imgur.com/7a0QJx8.jpg

回答

1

所有你需要做的,设置网格约束,以满足您的需求。为此,请将Labels置于GridRow(不需要StackPane),并将它们的vAlignment和hAlignment设置为Center。然后将vGrow和hGrow的标签设置为Priority.ALWAYS

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     GridPane gridPane = createMainGrid(2, 2); 
     gridPane.setAlignment(Pos.CENTER); 
     gridPane.setHgap(10); 
     gridPane.setVgap(10); 

     Scene scene = new Scene(gridPane); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private GridPane createMainGrid(int rows, int columns) { 
     GridPane grid = new GridPane(); 

     for (int colIdx = 0; colIdx < columns; colIdx++) { 
      for (int rowIdx = 0; rowIdx < rows; rowIdx++) { 
       GridPane innerGrid = createGrid(4, 4); 
       grid.add(innerGrid, colIdx, rowIdx); 
       GridPane.setConstraints(innerGrid, colIdx, rowIdx, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS); 
      } 
     } 
     return grid; 
    } 

    private GridPane createGrid(int rows, int columns) { 
     GridPane grid = new GridPane(); 

     Random random = new Random(); 

     for (int colIdx = 0; colIdx < columns; colIdx++) { 
      for (int rowIdx = 0; rowIdx < rows; rowIdx++) { 
       Label label = new Label(String.valueOf(random.nextInt(rows * columns))); 
       label.setMinSize(30, 30); 
       label.setAlignment(Pos.CENTER); 
       grid.add(label, colIdx, rowIdx); 
       GridPane.setConstraints(label, colIdx, rowIdx, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS); 
      } 
     } 
     return grid; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
}