【问题标题】:Javafx Pane "forgets" layoutJavafx 窗格“忘记”布局
【发布时间】:2015-09-17 20:49:38
【问题描述】:

我有一个创建和返回 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();
    }

【问题讨论】:

  • 也许详细描述什么是“堆栈窗格”有助于回答这个问题?
  • 你能创建一个minimal reproducible example。我认为在您提供的有限背景下回答您的问题的希望不大。
  • 我在编辑下添加了上述示例。

标签: java javafx


【解决方案1】:

这是因为当您调整舞台大小时,TilePane 也会调整为舞台的大小,因为没有任何东西支撑它。

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

由于您在 600 处有一个阶段 - 磁贴窗格不能限制为 100....

StackPane 将以子元素为中心进行布局,这就是它看起来正确的原因。如果您只是将它放在窗格上,那么您的 TilePane 将位于左上角....

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2013-10-27
    • 2016-11-15
    相关资源
    最近更新 更多