2016-04-29 70 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); 
    } 
}