2015-06-25 33 views
3

我有一個實現自定義ProgressBar的對象。有時我希望酒吧的曲目有白色,有時候我想讓它變成黑色。我發現,可以通過設置它的默認值在我的.css文件如下:我可以使用setStyle()直接更改Node的子結構類樣式嗎?

.my-bar .track { 
    -fx-background-color: bar-default-color; 
} 

我希望我可以改變的基礎上的價值設置通過構造函數的顏色。但儘管谷歌搜索了它,我還沒有找到一個例子,其中使用Node.setStyle()來更改子結構類的樣式。直接在ProgressBar對象上調用setStyle(「 - fx-background-color:desired-color」)會創建與我想要的不匹配的奇怪顏色。我相信那是因爲我需要將它設置在.track子結構而不是父類。那麼,如何通過代碼訪問並更改它?

回答

2

它不能是通過使用setStyle直接更改CSS屬性(),但(作爲查找的替代方法)可以更改CSS屬性中使用的顏色,這些顏色在modena.css .root中定義。

因此,對於你的使用情況,進度條軌道被定義爲:

.progress-bar > .track { 
     -fx-background-color: 
      -fx-shadow-highlight-color, 
      linear-gradient(to bottom, derive(-fx-text-box-border, -10%), -fx-text-box-border), 
      linear-gradient(to bottom, 
      derive(-fx-control-inner-background, -7%), 
      derive(-fx-control-inner-background, 0%), 
      derive(-fx-control-inner-background, -3%), 
      derive(-fx-control-inner-background, -9%) 
     ); 
    -fx-background-insets: 0, 0 0 1 0, 1 1 2 1; 
    -fx-background-radius: 4, 3, 2; /* 10, 9, 8 */ 
} 

這裏-fx-shadow-highlight-color-fx-text-box-border-fx-control-inner-background是預定義的顏色。他們可以通過使用setStyle改變:

progBar.setStyle("-fx-control-inner-background: aqua; 
        -fx-text-box-border: red; 
        -fx-shadow-highlight-color:yellow" 
       ); 
+0

起初這不起作用,但它開始後,我從我的CSS文件中刪除了-fx-background-color行。這就是說,這不是一個完美的解決方案。我希望軌跡欄是一個單一的純色(我爲每個3 CSS屬性使用相同的顏色)。但使用你的方法,尤其是白色和其他較淺的顏色,有一個小的但明顯的漸變效果。毫無疑問,這來自於modena.css中的線性梯度派生線。當我在我的css中設置-fx-background-color時,它將覆蓋它。但通過你的方法,我們正在使用包含漸變的模式規則。 –

4

您可以使用它lookup()提取與從ProgressBar的styleClass .track的節點,然後應用樣式到它:

final Node track = progressBar.lookup(".track"); 
track.setStyle("-fx-background-color: desired-color"); 
+0

這個答案的問題是,我試圖設置顏色應用程序時顯示前的對象實例化(展前())。直到調用show之後纔會創建子結構,所以我總是以查找結果爲null。我在網上找到的另一個解決方案是使用getChildrenUnmodifiable()獲取子類的列表並查看它們,但遇到了同樣的問題。它返回的節點列表一直是空的,直到show()之後。 –

相關問題