我认为被接受的回答不是正确的。在 AnchorPane
中设置锚点会执行文档中所述的操作(setBottomAnchor
):
如果设置了,锚定面板将保持子项的大小和位置,使其底部始终相对于锚定面板的底部内容边缘偏移该量。
但这并不是需要的结果。想要的是安排子级和父级具有相同的大小。
从我的实验中重要的一点是要认识到,父节点 Node
会接受和适应其子节点/子项的宽度和高度(首选宽度?首选高度?)... 如果你告诉它如何做。换句话说,机制的工作方向与您可能认为的相反:父级可以被告知适应子级,而不是子级适应父级。
使用 SceneBuilder 包含 ScrollPane
和 TextArea
的 AnchorPane
中的 HBox
,可以实现问题所需的效果。
<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和AnchorPane没有“首选宽度”设置。
在SceneBuilder中,需要调整ScrollPane和AnchorPane的设置。在右侧面板/展开菜单下选择“布局:...”,选择ScrollPane,并将“Pref Width”设置为“USE_COMPUTED_AREA”。然后选择AnchorPane并执行相同的操作。最后,选择TextArea并将其设置为您的选择,例如在我的情况下为800(像素)。显然,如果您想要更复杂的设置,可以在代码中对此进行调整。
然后,您将看到TextArea的父级Node(AnchorPane)和祖父级Node(ScrollPane)会自动调整以适应TextArea。
请注意,
HBox
的
prefWidth
设置将被
忽略。像
HBox
这样的容器通常会自适应其子元素,只有当您将其
maxWidth
设置为与其子元素的要求不兼容的值时,才会应用该约束条件。
如果您将一个孙节点
Node
的
prefWidth
设置为800,则可以假设在正常情况下计算出祖父级别的
ScrollPane
的宽度:这将涉及到所有三个组件中边框、填充、边距等设置。请注意类
Region
中的
protected
方法
computePrefWidth
,旨在供子类覆盖,这可能会很有用。
此外,在
ScrollPane
的情况下,垂直和/或水平滚动条的存在与否是很重要的,因为它们会随时出现。如果您在
TextArea
上设置了
wrapText
为
true
,您可能希望从不会出现水平滚动条。我的实验似乎表明,您还需要将
ScrollPane
的
fitToWidth
属性设置为
true
。