GridPane 中 Label 的 JavaFX 对齐
JavaFX alignment of Label in GridPane
我很困惑为什么设置 Label.setAlignment(Pos.CENTER_RIGHT) 不会影响随后添加到 GridPane 中的标签的对齐方式?唯一的方法似乎是通过网格(例如 ColumnConstraints)或通过例如将标签添加到右对齐的 HBox。
为什么将标签的对齐设置为CENTER_RIGHT没有效果?我可以看到 API 说:"Specifies how the text and graphic within the Labeled should be aligned when there is empty space within the Labeled." 但是如何在标签中获取空的 space?
TL:DR 版本:使用 GridPane.setHalignment(label, HPos.RIGHT);
.
而不是 label.setAlignment(Pos.CENTER_RIGHT);
JavaFX 使用自上而下的布局。因此,场景将根节点调整为场景的大小,根节点的大小和位置取决于其布局策略和场景给它的 space 的每个子节点的大小,然后每个子节点的大小和根据它自己的布局策略和它可用的space数量定位它的子节点,依此类推场景图。
根据 Label
的文档,alignmentProperty
Specifies how the text and graphic within the Labeled should be aligned when there is empty space within the Labeled.
当然,标签可用的 space 数量由其父级决定,在本例中为网格窗格。您当然可以通过阅读其 documentation 了解网格窗格的布局策略以及如何配置它。不过,简而言之:
默认情况下,网格窗格会为每个节点分配其首选大小,如果放置它的单元格有额外的 space,则会将节点对齐到网格单元格的左上角。标签的首选大小当然是计算大小:刚好足以容纳其内容。因此,您会看到简单地将标签放入网格窗格并在标签上设置对齐方式不会有任何效果,因为标签的大小刚好足以容纳其内容,并且没有额外的 space 来对齐text/graphic。您可以通过在标签上放置背景颜色或边框来形象化这一点。
因此您可以将标签上的对齐设置为CENTER_RIGHT
,然后指示网格窗格让标签增长。这需要两件事:首先,告诉网格窗格让标签填充单元格的宽度:
GridPane.setFillWidth(label, true);
并且,由于网格窗格还将遵守子节点的最大大小,并且默认情况下标签使用其首选大小作为其最大大小,因此允许标签增长:
label.setMaxWidth(Double.MAX_VALUE);
然后标签将增长到单元格的大小,所以如果你也有
label.setAlignment(Pos.CENTER_RIGHT);
它将自己的内容右对齐。
更明智的做法可能只是告诉网格窗格如何对齐单元格中的标签:
GridPane.setHalignment(label, HPos.RIGHT);
然后让标签采用默认大小和对齐方式,一切正常。
您还可以使用 ColumnConstraints
对象为特定列中的所有标签设置默认对齐方式,如果您正在构建表单,这是迄今为止更方便的方法。
我很困惑为什么设置 Label.setAlignment(Pos.CENTER_RIGHT) 不会影响随后添加到 GridPane 中的标签的对齐方式?唯一的方法似乎是通过网格(例如 ColumnConstraints)或通过例如将标签添加到右对齐的 HBox。
为什么将标签的对齐设置为CENTER_RIGHT没有效果?我可以看到 API 说:"Specifies how the text and graphic within the Labeled should be aligned when there is empty space within the Labeled." 但是如何在标签中获取空的 space?
TL:DR 版本:使用 GridPane.setHalignment(label, HPos.RIGHT);
.
label.setAlignment(Pos.CENTER_RIGHT);
JavaFX 使用自上而下的布局。因此,场景将根节点调整为场景的大小,根节点的大小和位置取决于其布局策略和场景给它的 space 的每个子节点的大小,然后每个子节点的大小和根据它自己的布局策略和它可用的space数量定位它的子节点,依此类推场景图。
根据 Label
的文档,alignmentProperty
Specifies how the text and graphic within the Labeled should be aligned when there is empty space within the Labeled.
当然,标签可用的 space 数量由其父级决定,在本例中为网格窗格。您当然可以通过阅读其 documentation 了解网格窗格的布局策略以及如何配置它。不过,简而言之:
默认情况下,网格窗格会为每个节点分配其首选大小,如果放置它的单元格有额外的 space,则会将节点对齐到网格单元格的左上角。标签的首选大小当然是计算大小:刚好足以容纳其内容。因此,您会看到简单地将标签放入网格窗格并在标签上设置对齐方式不会有任何效果,因为标签的大小刚好足以容纳其内容,并且没有额外的 space 来对齐text/graphic。您可以通过在标签上放置背景颜色或边框来形象化这一点。
因此您可以将标签上的对齐设置为CENTER_RIGHT
,然后指示网格窗格让标签增长。这需要两件事:首先,告诉网格窗格让标签填充单元格的宽度:
GridPane.setFillWidth(label, true);
并且,由于网格窗格还将遵守子节点的最大大小,并且默认情况下标签使用其首选大小作为其最大大小,因此允许标签增长:
label.setMaxWidth(Double.MAX_VALUE);
然后标签将增长到单元格的大小,所以如果你也有
label.setAlignment(Pos.CENTER_RIGHT);
它将自己的内容右对齐。
更明智的做法可能只是告诉网格窗格如何对齐单元格中的标签:
GridPane.setHalignment(label, HPos.RIGHT);
然后让标签采用默认大小和对齐方式,一切正常。
您还可以使用 ColumnConstraints
对象为特定列中的所有标签设置默认对齐方式,如果您正在构建表单,这是迄今为止更方便的方法。