JavaFX:FXML:如何让孩子扩展其大小以适应父窗格?

时间:2014-03-08 15:08:24

标签: java javafx-2 fxml

我设法在父fxml(mainMenu UI)下加载子fxml(子UI)。 我创建了一个id为“mainContent”的AnchorPane。此窗格绑定到4个方面,并且更改符合舞台。

子窗口将加载到“mainContent”锚定窗格中。但是,我无法弄清楚如何让孩子与其父“mainContent”一起改变。

我的子UI就像这样调用。

@FXML
private void mnuUserLevel_onClick(ActionEvent event) {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("DBedit.fxml"));
    loader.setController(new DBeditEntityUserlevel());

    try {
           Node n = (Node)loader.load();
           mainContent.getChildren().add(n);
    } catch (IOException e){
           System.out.println(e.getMessage());
    }
}

为了进一步说明我的问题,请参阅我的快照。红场就是孩子。黄色方块是MainMenu父级的“mainContent”AnchorPane。

enter image description here

6 个答案:

答案 0 :(得分:39)

如果将AnchorPane内的窗格的 topAnchor,bottomAnchor,leftAnchor,rightAnchor 值设置为 0.0 ,则面板将延伸到周围AnchorPane的完整范围

文档链接:AnchorPane

编辑:在文档链接中,您还可以看到如何在Java代码中设置这些值。

FXML示例:

<AnchorPane fx:id="mainContent" ...>
<StackPane fx:id="subPane" AnchorPane.topAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" ></StackPane>
</AnchorPane>

答案 1 :(得分:24)

如果您有RegionNode子类,其中包含AxisChartControl,和Pane(这可能包括您可能需要加载的任何内容),您可以绑定子级的大小与父级中的空格类似here。现在,任何未来父母大小的调整都将反映在孩子身上。

Region n = (Region)loader.load();
mainContent.getChildren().add(n);
n.prefWidthProperty().bind(mainContent.widthProperty());
n.prefHeightProperty().bind(mainContent.heightProperty());

答案 2 :(得分:1)

我认为公认的答案不是正确的答案。在AnchorPane中设置锚点与the documentationsetBottomAnchor)中所说的一样:

如果设置,锚定板将保持孩子的大小和位置,以便 它的底部总是从锚定板的 底部内容边缘。

但这不是期望的。这是为了安排孩子和父母的大小相同。

从我的实验中可以体会到的重要一点是,父母Node会接受并适应其孩子的宽度和高度(首选的宽度?首选的高度?)... (如果您告诉它) 。换句话说,该机制的作用与您可能假设的相反:可以告诉父母适应孩子,而不是让孩子适应父母。

使用SceneBuilder,使用包含HBoxScrollPane并包含AnchorPane的{​​{1}},使用SceneBuilder可以完成问题的查找:

TextArea

请注意,没有使用锚,最重要的是 <HBox prefHeight="100.0" prefWidth="200.0"> <children> <ScrollPane prefHeight="100.0"> <content> <AnchorPane> <children> <TextArea fx:id="logTextArea" prefWidth="800.0"> </TextArea> </children> </AnchorPane> </content> </ScrollPane> </children> </HBox> ScrollPane没有“首选宽度”设置。

在SceneBuilder中,要在此处为​​AnchorPaneScrollPane进行调整的对象位于右侧面板/音乐会中的“布局:...:”下,选择{{1} },并将“预定义宽度”设置为“ USE_COMPUTED_AREA”。然后选择AnchorPane并执行相同的操作。最后,选择ScrollPane并将其设置为您的选择,例如在我的情况下为800(像素)。显然,可以根据需要将此设置调整为代码中更复杂的内容。

然后您将看到AnchorPaneTextArea)的父Node和祖父母TextAreaAnchorPane)进行调整以适应{{1 }}。

请注意,Node的{​​{1}}设置随后会 被忽略 。像ScrollPane这样的容器的正常工作是容纳其后代,只有将其TextArea设置为与该后代的要求不兼容的东西,该约束才适用。

如果像这样设置prefWidth为800的孙子HBox,我认为在正常情况下,有一些方法可以计算祖父母HBox的宽度:这将与所涉及的所有三个组件中的边框,填充,边距等设置有关。请注意,类maxWidth Node中的prefWidth方法是为子类覆盖而准备的,可能会引起人们的兴趣。

此外,在ScrollPane的情况下,出现垂直滚动条和/或水平滚动条的时间不存在。如果您在protected上将Region设置为computePrefWidth,则可能希望水平滚动条永远不会出现。我的实验似乎表明,您还需要将ScrollPane的{​​{1}} wrapText设置为true

答案 3 :(得分:0)

通过查看界面结构,我猜你最好使用BorderPane作为你的父容器,这个建议不要直接在BorderPane容器中使用AnchorPane这里是我的建议:

- &gt; BorderPane-Top =&#34;您的菜单&#34;

- &gt; BorderPane-Center =另一个容器(可能是SplitPane,另一个BorderPane等......但我猜不是AnchorPane但你可以试试,如果你想要的话)

- &gt; BorderPane-Bottom =另一个容器(可以是带按钮的hbox或信息或通知标签等。)

答案 4 :(得分:0)

您可以尝试设置prefWidth。我不知道为什么,但看起来它需要在将newPane引用到您的AnchorPane之后在SceneBuilder中设置的prefWidth。

Node newPane = FXMLLoader.load(getClass().getResource("view/YourPane.fxml"));
List<Node> parentChildren = ((Pane)yourAnchorPaneId.getParent()).getChildren();
parentChildren.set(parentChildren.indexOf(yourAnchorPaneId), newPane);
yourAnchorPaneId.setPrefWidth(1800); // 1800 just example value for test
Main.primaryStage.setWidth(500); // 500 example value with which you wishe to start app

答案 5 :(得分:0)

方法1:

spring.liquibase.change-log=classpath:/db/changelogs/changelog-master.xml

替代方法;

// @FXML private AnchorPane pnlContainer;

FXMLLoader loader = new FXMLLoader(getClass().getResource("Demo.fxml"));

Node _node = loader.load();

_node.prefWidth(pnlContainer.widthProperty().doubleValue());
_node.prefHeight(pnlContainer.heightProperty().doubleValue());

// container child clear
pnlContainer.getChildren().clear();

// new container add
pnlContainer.getChildren().add(_node);

方法2详细信息链接:JavaFX Panel inside Panel auto resizing