2016-02-16 57 views
5

我很困惑爲什麼設置Label.setAlignment(Pos.CENTER_RIGHT)不會影響隨後添加到GridPane中的標籤的對齊方式?唯一的方法是通過網格(例如ColumnConstraints)或者通過例如將標籤添加到右對齊的HBox。GridPane中標籤的JavaFX對齊

爲什麼將標籤的對齊方式設置爲CENTER_RIGHT不起作用?我可以看到API說:「指定Labeled內的文本和圖形如何在Labeled內部有空的時候對齊。」但是,如何獲得標籤中的空白空間?

回答

13

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

JavaFX使用自頂向下佈局。因此,場景將根節點調整到場景的大小,根節點的大小和每個子節點的位置取決於其佈局策略和場景賦予的空間量,然後每個子節點調整其大小並定位其子節點取決於它自己的佈局策略和它可用的空間量,等等。

根據對Label的文檔中,alignmentProperty

指定如何時,有內標記的空的空間內的標記文本和圖形應保持一致。

當然,可用於標籤的空間量由其父項決定,在本例中爲網格窗格。您當然可以瞭解網格窗格的佈局策略以及如何通過閱讀其documentation來配置它。簡而言之,雖然:

默認情況下,網格窗格將爲每個節點分配其首選大小,並且,如果它放置的單元格具有額外的空間,則將對齊網格單元格左上角的節點。標籤的首選尺寸當然是計算的尺寸:只是足夠大以容納其內容。因此,您會發現只需將標籤放置在網格窗格中並在標籤上設置對齊方式將不會產生任何效果,因爲標籤的大小足以容納其內容,並且沒有多餘的空間來對齊文本/圖形。您可以通過在標籤上放置背景顏色或邊框來將其可視化。

因此,您可以將標籤上的對齊設置爲CENTER_RIGHT,然後指示網格窗格讓標籤生長。這需要兩件事情:第一,告訴網格窗格讓標籤填充單元格的寬度:

GridPane.setFillWidth(label, true); 

,而且由於網格窗格也將尊重孩子節點的最大尺寸,並默認使用的標籤它的首選大小爲最大尺寸,使品牌的發展:

label.setMaxWidth(Double.MAX_VALUE); 

則標籤將增長到細胞的大小,所以,如果你也有

label.setAlignment(Pos.CENTER_RIGHT); 

它將調整其自己的公司有意向。

一個更明智的做法可能只是告訴網格窗格如何對齊標籤在細胞:

GridPane.setHalignment(label, HPos.RIGHT); 

然後讓標籤承擔其默認大小和對齊,一切都將正常工作。

您還可以使用ColumnConstraints對象爲特定列中的所有標籤設置默認對齊方式,這對於構建表單來說是更方便的方法。

+0

謝謝你,這是一個很好的迴應。 – Tranquility

+0

需要注意的一點 - 通過將標籤首選寬度設置爲較大的值,或者通過設置指定的最大寬度,然後將對齊設置爲正確,可以正確對齊。換句話說,對setFillWidth的調用是不需要的?你可以進一步解釋爲什麼這是這種情況,當我需要實際使用setFillWidth? – Tranquility

+0

'setFillWidth(true)'表示網格窗格會將節點的大小設置爲其最大寬度或列寬度的最大值。如果'setFillWidth'爲false(默認),它會將節點的寬度設置爲其首選寬度。請注意,列的寬度取決於其所有內容的最大寬度。所以通過增加節點的寬度可以強制列的寬度比你想要的寬。 –