如何使JavaFX中的子面板(Pane)自动调整大小(其父节点是VBox)

4

我有两个问题

1.在JavaFX应用程序中,我想将子项(crosshairArea)放置在其父项的左上角,同时宽度和高度为其父项的1/2。 我认为可以通过覆盖父类函数“layoutChildren”(VBox)来实现, 还有其他方式吗?例如属性绑定?

2.最初,VBox将占用整个场景区域,如何使(重新定位)其位于场景的下半部分?

public class Crossh extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {        
        VBox root = new VBox(5);
        // root.setPadding(new Insets(20,20,20,20));
        root.setStyle("-fx-border-color:red");

        Pane crosshairArea = new Pane();
        crosshairArea.maxWidthProperty().bind(root.widthProperty());
        crosshairArea.setStyle("-fx-border-color:black");       

        root.getChildren().add(crosshairArea);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("Location Crosshair");
        stage.setWidth(900);
        stage.setHeight(700);        
        stage.show();
    }
}
2个回答

7
将VBox的最后一个子元素的vgrow属性设置为true。
pane.setVgrow(true);

那将解决这个问题。

10
VBox.setVgrow(child, Priority.ALWAYS); 对我非常有效。 - ManoDestra

4

对于你的第一个问题,你尝试过使用VBox的 height 属性吗?例如:

root.heightProperty().addListener(new ChangeListener<Number>() {

        @Override
        public void changed(ObservableValue<? extends Number> arg0,
                Number arg1, Number arg2) {
            crosshairArea.setPrefHeight(arg2.doubleValue()/2);

    }
});

对于您的第二个问题,您需要在VBox上方放置一个东西以占据顶部大小,或者您可以将VBox的对齐方式设置为Pos.BOTTOM


谢谢!还有一个问题是为什么我不能将crosshairArea的widthProperty()绑定到其父级?因为它是只读属性吗?并且是否有任何函数会在窗口初始化完成后由框架回调,例如类似于MFC的onWindowResize(),我想我可以在那里调整所有子项的大小? - Rui Zhou
我认为 VBox 并不支持这样的事情。从逻辑上讲,VBox 是一个 垂直 盒子,其子元素必须完全填充可用的宽度。但我不确定,专业人士可能会回答得更好! - ItachiUchiha
对于“窗口调整大小”,您可以绑定“场景”的widthProperty和heightProperty! - ItachiUchiha
1
您还可以使用VBox.setVgrow(child, Priority.ALWAYS);设置垂直增长。这对我来说非常有效,因为我使用了一个包含TableView和Pagination控件的VBox来创建分页数据表格。表格随高度自然增长,而分页控件则不会,因为我将其设置为Priority.NEVER。无需添加复杂、容易出错的监听器。 - ManoDestra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接