我正在尝试用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的网格。

java - JavaFX TilePane setPrefColumn/Row方法不起作用?-LMLPHP

任何帮助将不胜感激。谢谢!

最佳答案

在您的代码中,TilePane的宽度由父级VBox而不是prefColumnsTilePane属性确定。

javadoc of prefColumns


  该值仅用于计算图块的首选大小,并且可能无法反映实际的行数,如果将图块调整为其首选高度宽度以外的其他大小,则行数可能会更改。


(我修复的文档有些错误。)

您需要使用不会调整TilePane大小的父对象。 (默认情况下,VBox会调整其子级的大小。)使用VBox.setFillWidth更改此行为:

root.setFillWidth(false);

07-24 16:06