当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《JavaFXTilePanesetPrefColumn/Row方法不起作用?》经验,为你挑选了1个好方法。

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

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



1> fabian..:

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

来自的javadocprefColumns

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

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

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

root.setFillWidth(false);

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有