Javafx Pane "forgets"布局

标签 java javafx

我有一个创建并返回 Pane 的函数,该 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;
    }

将此对象传递到场景会返回:

enter image description here

但是,如果我先将其添加到 StackPane,我会得到以下结果:

enter image description here

为什么堆栈 Pane “修复”了我的问题,以及应该采取什么措施来确保所有 Pane 都能正确表示?这是预期的行为吗?

如果我使用

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 则单独保持在 100X100 的位置,以 StackPane 为中心。

由于您的阶段为 600 - 平铺 Pane 不能限制为 100....

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

希望这有帮助。

关于Javafx Pane "forgets"布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32639726/

相关文章:

java - 如何将 JLabels 定位到 Java GUI 上的绝对位置

java - 如何从内循环跳转到外循环

javafx-2 - JavaFx、事件拦截/消费

JavaFX:如何根据 GridPane 内动态创建的文本字段的值计算平均值?

java - 带有 XML 标记或 Java 编程的 JavaFX gui 之间的区别?

java - 在已经使用 spring-mvc 作为依赖项的依赖项的应用程序中设置 spring-mvc

java - Java 3D 中表面的每一面是否可以有不同的颜色?

JavaFX 多线程

JavaFX:在 WebView img 标签中未加载本地镜像

java.lang.IllegalStateException : Component ID has already been found in the view