我正在尝试用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<String>((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
属性确定。
从javadoc of prefColumns
:
该值仅用于计算图块的首选大小,并且可能无法反映实际的行数,如果将图块调整为其首选高度宽度以外的其他大小,则行数可能会更改。
(我修复的文档有些错误。)
您需要使用不会调整TilePane
大小的父对象。 (默认情况下,VBox
会调整其子级的大小。)使用VBox.setFillWidth
更改此行为:
root.setFillWidth(false);