我正在开发一个数独应用程序,但我遇到了一个阻碍我进步的问题。我想做的是制作我用循环创建的数独板,它将标签添加到 StackPane 中,并且 StackPane 进入 GridPane 中的指定位置。因此,我试图强制该板具有设定的尺寸,并且不会超出该尺寸。
我花了整个晚上研究和尝试不同的事情,例如将 GridPane 放入 AnchorPane 并尝试将 AnchorPane 放在 BorderPane 的中心,但当您使用时,它似乎总是超出窗口之外数独板的行和列太多。
我想要做的是为所有板设置一个固定尺寸,因此如果需要,它会拉伸(stretch)到该点,或者如果需要,它会收缩。所附图片使用 BorderPane,中间放置 GridPane。您可以看到 16x16 非常适合,而 25x25 则刚好超出了 window 范围。
我们将非常感谢您的帮助。
尝试创建 25x25 时窗口的外观图片。
http://i.imgur.com/BrJrpiY.png
尝试创建 16x16 时窗口的外观图片。 这还使用插图将其推向顶部,这样它看起来就不会太不合适。
最佳答案
您所要做的就是设置网格约束以满足您的需求。为此,请将 Labels
放入 GridRow
(不需要 StackPane
)并将其 vAlignment 和 hAlignment 设置为 Center。然后将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);
}
}
关于JavaFX,无法让 GridPane 适合 BorderPane 的中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36949054/