我设法在父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。
答案 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)
如果您有Region
,Node
的子类,其中包含Axis
,Chart
,Control
,和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 documentation(setBottomAnchor
)中所说的一样:
如果设置,锚定板将保持孩子的大小和位置,以便 它的底部总是从锚定板的 底部内容边缘。
但这不是期望的。这是为了安排孩子和父母的大小相同。
从我的实验中可以体会到的重要一点是,父母Node
会接受并适应其孩子的宽度和高度(首选的宽度?首选的高度?)... (如果您告诉它) 。换句话说,该机制的作用与您可能假设的相反:可以告诉父母适应孩子,而不是让孩子适应父母。
使用SceneBuilder,使用包含HBox
和ScrollPane
并包含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中,要在此处为AnchorPane
和ScrollPane
进行调整的对象位于右侧面板/音乐会中的“布局:...:”下,选择{{1} },并将“预定义宽度”设置为“ USE_COMPUTED_AREA”。然后选择AnchorPane
并执行相同的操作。最后,选择ScrollPane
并将其设置为您的选择,例如在我的情况下为800(像素)。显然,可以根据需要将此设置调整为代码中更复杂的内容。
然后您将看到AnchorPane
(TextArea
)的父Node
和祖父母TextArea
(AnchorPane
)进行调整以适应{{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