繁体   English   中英

Javafx窗格“忘记”布局

[英]Javafx Pane “forgets” layout

我有一个创建并返回Pane的函数,该函数存储在其他位置。 当用户按下按钮时显示。

public Pane createBoard(Board d){
        TilePane tilepane = new TilePane();
        pane.setPrefColumns(8);
        pane.setPrefRows(8);
        pane.setMaxSize(400,400);
        pane.setMinSize(400,400);

        for(Cell c : d.getCells()){
            pane.getChildren().add(c);
        }    

        return tilepane;
    }

将此对象传递到场景将返回以下内容:

在此处输入图片说明

但是,如果我首先将其添加到StackPane中,则会得到以下信息:

在此处输入图片说明

为什么stackpane可以“解决”我的问题,并且应该采取什么措施来确保正确显示所有窗格? 这是预期的行为吗?

如果我用

Pane tilepane = createBoard(new Board());
StackPane stackpane = new StackPane();
stackpane.getchildren().add(tilepane);
Scene scene = new Scene(stackpane,600,600);

我得到了预期的结果。

如果我使用:

Pane tilepane = createBoard(new Board());
Scene scene = new Scene(tilepane,600,600);

我得到第一张图片。


编辑:

StackPane基本上将所有子节点直接放置在彼此之上。 在这个问题的上下文中,我使用的StackPane只有一个孩子,即TilePane。

例:

非工作:

 public void start(Stage primaryStage) {   

        TilePane tp = new TilePane();
        tp.setPrefColumns(5);
        tp.setPrefRows(5);
        tp.setMaxSize(100, 100);

        ArrayList<Rectangle> rectangles = new ArrayList();

        for(int i = 0;i<25;i++){
        rectangles.add(new Rectangle(20,20));
        }

        for(int i = 0;i<25;i++){
        rectangles.get(i).setFill(Color.rgb(i*2, i*9, i*6));
        }
        tp.getChildren().addAll(rectangles);

        Scene scene = new Scene(tp, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

工作:

 public void start(Stage primaryStage) {   


        TilePane tp = new TilePane();
        tp.setPrefColumns(5);
        tp.setPrefRows(5);
        tp.setMaxSize(100, 100);

        ArrayList<Rectangle> rectangles = new ArrayList();

        for(int i = 0;i<25;i++){
        rectangles.add(new Rectangle(20,20));
        }

        for(int i = 0;i<25;i++){
        rectangles.get(i).setFill(Color.rgb(i*2, i*9, i*6));
        }
        tp.getChildren().addAll(rectangles);

        StackPane stack = new StackPane();                            <-- Added
        stack.getChildren().add(tp);                                 <--Added
        Scene scene = new Scene(stack, 600, 600);                    <-- Changed to stack from tp
        primaryStage.setScene(scene);
        primaryStage.show();
    }

这是因为在调整舞台大小时,由于没有任何支撑,因此TilePane也被调整为舞台的大小。

当您将其包装在StackPane中时,它可以遵守最大值,因为StackPane会调整为新的舞台大小(在本示例中为600x600),而TilePane单独放置在StackPane的中心为100X100。

由于您的舞台为600,因此不能将瓷砖窗格限制为100 ....

StackPane将布局以孩子为中心,这就是为什么它看起来正确的原因。 如果仅将其放在窗格上,则TilePane将位于左上角。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM