JavaFX,无法让 GridPane 适合 BorderPane 的中心
JavaFX, can't get GridPane to fit in the center of BorderPane
我正在开发数独应用程序,但遇到了阻碍我进步的问题。我想要做的是制作这个我用循环创建的数独板,它将一个标签添加到 StackPane 中,然后 StackPane 进入它在 GridPane 中的指定位置。所以我试图强制这个板有一个固定的大小,并且不会超过那个点。
我整个晚上都在研究和尝试不同的东西,例如将 GridPane 放入 AnchorPane 并尝试将 AnchorPane 放在 BorderPane 的中心,但它似乎总是超出 window, 当你为数独板使用太多的行和列时。
我想要做的是为所有板设置一个尺寸,因此如果需要它会拉伸到那个点,或者如果需要它会缩小。所附图片使用的是 BorderPane,中间有一个 GridPane。您可以看到 16x16 非常适合,而 25x25 刚好超出 window.
非常感谢您的帮助。
尝试创建 25x25 时 window 的外观图片。
http://i.imgur.com/BrJrpiY.png
尝试创建 16x16 时 window 的外观图片。
这也使用插图将其推向顶部,因此看起来不会太不合适。
您所要做的就是设置网格约束以满足您的需要。为此,将 Labels
放在 GridRow
中(不需要 StackPane
)并将它们的 vAlignment 和 hAlignment 设置为中心。然后设置label的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);
}
}
我正在开发数独应用程序,但遇到了阻碍我进步的问题。我想要做的是制作这个我用循环创建的数独板,它将一个标签添加到 StackPane 中,然后 StackPane 进入它在 GridPane 中的指定位置。所以我试图强制这个板有一个固定的大小,并且不会超过那个点。
我整个晚上都在研究和尝试不同的东西,例如将 GridPane 放入 AnchorPane 并尝试将 AnchorPane 放在 BorderPane 的中心,但它似乎总是超出 window, 当你为数独板使用太多的行和列时。
我想要做的是为所有板设置一个尺寸,因此如果需要它会拉伸到那个点,或者如果需要它会缩小。所附图片使用的是 BorderPane,中间有一个 GridPane。您可以看到 16x16 非常适合,而 25x25 刚好超出 window.
非常感谢您的帮助。
尝试创建 25x25 时 window 的外观图片。
http://i.imgur.com/BrJrpiY.png
尝试创建 16x16 时 window 的外观图片。 这也使用插图将其推向顶部,因此看起来不会太不合适。
您所要做的就是设置网格约束以满足您的需要。为此,将 Labels
放在 GridRow
中(不需要 StackPane
)并将它们的 vAlignment 和 hAlignment 设置为中心。然后设置label的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);
}
}