我正在尝试用JavaFX制作Suduko板。我听说TilePane对此特别有用,因为TilePane背后的整个想法是每个“平铺”的大小均一。太好了,这就是Suduko棋盘,国际象棋棋盘,跳棋,井字游戏,战舰等的声音。听起来像TilePane是任何类型的棋盘游戏应用程序必不可少的窗格。
还是?
import javafx.application.Application; import javafx.application.Platform; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.TextField; import javafx.scene.control.TextFormatter; import javafx.scene.control.TextFormatter.Change; import javafx.scene.image.Image; import javafx.scene.layout.TilePane; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class SudukoSolver extends Application { Stage window; Scene scene; private final int TEXTFIELD_WIDTH = 32; private final int TEXTFIELD_HEIGHT = 32; @Override public void start(Stage window) throws Exception { this.window = window; window.setTitle("Suduko Solver"); window.setOnCloseRequest(e -> closeProgram()); // Does setting this to false defeat the purpose of TilePane? window.setResizable(false); VBox root = new VBox(); //root.setAlignment(Pos.CENTER); TilePane tiles = new TilePane(); tiles.setAlignment(Pos.CENTER); // Does not appear to do anything. tiles.setPrefColumns(9); tiles.setPrefRows(9); // Add all the tiles to the Pane. root.getChildren().add(tiles); for (int i = 0; i < 81; i++) { TextField textBox = new TextField(); textBox.setMinHeight(TEXTFIELD_HEIGHT); textBox.setMaxHeight(TEXTFIELD_HEIGHT); textBox.setMinWidth(TEXTFIELD_WIDTH); textBox.setMaxWidth(TEXTFIELD_WIDTH); textBox.setTextFormatter(new TextFormatter((Change change) -> { String newText = change.getControlNewText(); if (newText.length() > 1) { return null ; } else if (newText.matches("[^1-9]")) { return null; } else { return change ; } })); tiles.getChildren().add(textBox); } scene = new Scene(root, 600, 750); window.setScene(scene); window.show(); } /** * This method is called when the user wishes to close the program. */ private void closeProgram() { Platform.exit(); } public static void main(String[] args) { launch(args); } }
请注意,这显然不是9x9的网格。
任何帮助将不胜感激。谢谢!
在您的代码中,您的宽度TilePane
由父级VBox
而不是由prefColumns
属性确定TilePane
。
来自的javadocprefColumns
:
该值仅用于计算图块的首选大小,并且可能无法反映实际的
行数,如果将图块调整为其首选高度宽度以外的其他大小,则行数可能会更改。
(我修复的文档有些错误。)
您需要使用不会调整大小的父对象TilePane
。(VBox
默认情况下会调整其子级的大小。)VBox.setFillWidth
用于更改此行为:
root.setFillWidth(false);