2015-11-19 39 views
0

我有一堆擴展JavaFX Button的自定義按鈕。他們是這樣的:爲什麼setPadding(getPadding())改變了JavaFX按鈕的外觀?

Regular buttons

我已經添加在構造函數中這一行:

setPadding(Insets.EMPTY); 

和按鈕改變了他們的樣子:

Altered buttons

我只想改變左右填充,所以我想知道原始值是什麼。我在構造函數中放置了一個斷點(在setPadding之前),並在調試器中運行了getPadding()。令我吃驚的是,結果是0, 0, 0, 0 - 那就是Insets.EMPTY

所以我跑了一個實驗 - 我已經改變了以前添加的行這樣的:

setPadding(getPadding()); 

和按鈕失去填充,即使插圖不應該改變。如何解釋?

回答

0

看來,最初的填充不適用於構造函數,但後來 - 除非你已經在代碼中覆蓋它。

填充存儲在StyleableObjectProperty<Insets>中。值得注意的是,此類提供一個getStyleOrigin()方法:

public StyleOrigin getStyleOrigin()

告訴屬性的值的來源。這是確定CSS是否可以覆蓋該值所需的。

我發現它不僅僅是檢查由Button.getPadding()返回的值,還有Button.paddingProperty()。我注意到,當setPadding()被調用時,該屬性實際上發生了變化 - 其專用origin字段從NULL變爲USER

根據我上面引用的JavaDoc,如果已經從代碼設置了CSS樣式的值,將不會應用。如果原點是NULL,它將被替換爲CSS主題的默認值。 setPadding(getPadding())不會更改屬性的值,但會更改其來源,所以CSS不能稍後重寫該值。

+1

因此,獲得您想要的實際效果的方法是在外部樣式表中用您自己的替換填充設置。 [默認填充](http://hg.openjdk.java.net/openjfx/8u60/rt/file/996511a322b7/modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/ modena/modena.css)是'-fx-padding:0.333333em 0.666667em 0.333333em 0.666667em; '。 –