【问题标题】:JavaFX alignment of Label in GridPaneGridPane 中标签的 JavaFX 对齐方式
【发布时间】:2016-05-28 01:25:38
【问题描述】:

我很困惑为什么设置 Label.setAlignment(Pos.CENTER_RIGHT) 不会影响随后添加到 GridPane 中的标签的对齐方式?唯一的方法似乎是通过网格(例如 ColumnConstraints)或通过例如将标签添加到具有右对齐的 HBox。

为什么将标签的对齐方式设置为 CENTER_RIGHT 没有效果?我可以看到 API 说:“指定标签内的文本和图形在标签内有空白空间时应如何对齐。”但是如何在标签中获得空白空间?

【问题讨论】:

    标签: javafx grid alignment label


    【解决方案1】:

    TL:DR 版本:使用 GridPane.setHalignment(label, HPos.RIGHT); 代替 label.setAlignment(Pos.CENTER_RIGHT);

    JavaFX 使用自上而下的布局。因此,场景将根节点的大小调整为场景的大小,根节点的大小和每个子节点的位置取决于其布局策略和场景给它的空间量,然后每个子节点调整其子节点的大小和位置取决于它自己的布局策略和可用空间量,等等。

    根据Label 的文档,alignmentProperty

    指定当 Labeled 中有空白区域时,Labeled 中的文本和图形应如何对齐。

    当然,标签可用的空间量由其父级决定,在本例中为网格窗格。您当然可以通过阅读其documentation 了解网格窗格的布局策略以及如何配置它。简而言之:

    默认情况下,网格窗格将为每个节点分配其首选大小,并且如果放置它的单元格有额外空间,则将对齐网格单元格左上角的节点。标签的首选尺寸当然是计算出来的尺寸:刚好足以容纳其内容。因此,您会看到简单地将标签放入网格窗格并在标签上设置对齐不会有任何效果,因为标签的大小刚好足以容纳其内容,并且没有额外的空间来对齐文本/图形。您可以通过在标签上放置背景颜色或边框来可视化这一点。

    因此您可以将标签上的对齐方式设置为CENTER_RIGHT,然后指示网格窗格让标签增长。这需要两件事:首先,告诉网格窗格让标签填充单元格的宽度:

    GridPane.setFillWidth(label, true);
    

    并且,由于网格窗格也将遵循子节点的最大尺寸,并且标签默认使用其首选尺寸作为其最大尺寸,因此允许标签增长:

    label.setMaxWidth(Double.MAX_VALUE);
    

    然后标签会增长到单元格的大小,所以如果你也有

    label.setAlignment(Pos.CENTER_RIGHT);
    

    它将自己的内容向右对齐。

    一个更明智的方法可能只是告诉网格窗格如何对齐单元格中的标签:

    GridPane.setHalignment(label, HPos.RIGHT);
    

    然后让标签采用其默认大小和对齐方式,一切都会正常工作。

    您还可以使用ColumnConstraints 对象为特定列中的所有标签设置默认对齐方式,如果您正在构建表单,这是迄今为止更方便的方法。

    【讨论】:

    • 一个注意点 - 我发现要么将标签首选宽度设置为更大的值,要么设置您指定的最大宽度,然后将对齐设置为正确,它可以正确对齐。换句话说,不需要调用 setFillWidth 吗?您能否进一步解释为什么会出现这种情况以及何时需要实际使用 setFillWidth?
    • setFillWidth(true) 表示网格窗格会将节点的大小设置为其最大宽度或列宽度的最大值。如果setFillWidth 为假(默认),它会将节点的宽度设置为其首选宽度。请注意,列的宽度由其所有内容的最大首选项宽度决定;因此,通过增加节点的首选项宽度,您可能会强制列比您想要的更宽。
    • 这是什么 FXML 版本?
    • @Winter <Label GridPane.halignment="RIGHT" ... />
    猜你喜欢
    • 2017-04-18
    • 2016-07-31
    • 2019-04-14
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多