2013-12-13 16 views
0

我有一些StackedBarChart包含各種系列。java fx圖表上的自定義選擇器

StackedBarChart.Series<String, Number> series1= new StackedBarChart.Series<String, Number>(
       FXCollections.observableArrayList(list1)); 
StackedBarChart.Series<String, Number> series2= new StackedBarChart.Series<String, Number>(
       FXCollections.observableArrayList(list2)); 
StackedBarChart.Series<String, Number> series3= new StackedBarChart.Series<String, Number>(
       FXCollections.observableArrayList(list3)); 
ObservableList<StackedBarChart.Series<String, Number>> barChartData = FXCollections 
       .observableArrayList(series1, series2, 
         series3); 
     final StackedBarChart<String, Number> chart = new StackedBarChart<String, Number>(
       xAxis, yAxis, barChartData); 

我想更改系列的默認顏色。 所以我增加了一個自定義的CSS樣式表

chart.getStylesheets().add("path to the CSS file"); 

在CSS文件,我可以用某物覆蓋默認的顏色像

.default-color0 { 
    -fx-bar-fill: limegreen; 
} 
.default-color1 { 
    -fx-bar-fill: orange; 
} 
.default-color2 { 
    -fx-bar-fill: tomato; 
} 

這完美的作品,但它只是我的顏色替換默認的顏色。 如果我將它們添加到圖表時更改了系列的訂單,它們將切換它們的顏色。

我想在我的CSS更精確的與某物像

.series1.color { 
    -fx-bar-fill: limegreen; 
} 
.series2.color { 
    -fx-bar-fill: orange; 
} 
.series2.color { 
    -fx-bar-fill: tomato; 
} 

,並直接添加這些自定義選擇該系列,而不是餵養與CSS樣式表的圖表。 我知道有自定義選擇器,您可以使用setId(..)方法在節點上設置,但我無法管理它。

我也瞭解lookup方法,但我覺得它不是優雅的,因爲在所有你必須調用它之後的圖表被渲染(因此你可以看到的顏色閃爍非常快原來的顏色和新的之間的)

所以我的問題是: 我如何定義CSS選擇器一樣

.series1.color { 
    -fx-bar-fill: limegreen; 
} 
.series2.color { 
    -fx-bar-fill: orange; 
} 
.series2.color { 
    -fx-bar-fill: tomato; 
} 

和編程方式將其應用到圖表系列我想

series1.applySelector(".series1.color"); 

因此,即使該系列被插入的圖表中不同的順序,他們仍然可以得到顏色我想

+0

問題是什麼? – Math

+0

我添加了它,你是對的,它不清楚:) – facewindu

回答

1

您可以將樣式設置直奔組件,無需編輯CSS:

series1.getNode().setStyle("-fx-bar-fill: limegreen;"); 
series2.getNode().setStyle("-fx-bar-fill: orange;"); 
series3.getNode().setStyle("-fx-bar-fill: tomato;"); 

或者你可以定義CSS ID和設置CSS ID爲java compoenten:

CSS

#clr1 { 
    -fx-bar-fill: limegreen;  
} 
#clr2 { 
    -fx-bar-fill: orange; 
} 
#clr3 { 
    -fx-bar-fill: tomato; 
} 

的Java

series1.getNode().setId("clr1"); 
series2.getNode().setId("clr2"); 
series3.getNode().setId("clr3"); 
+0

不,我不能。該系列沒有setStyle或setId方法。如果我嘗試使用series1.getNode()。獲取setSyle()或setId()方法我得到一個空指針異常,因爲該節點實際上還不存在(我猜) – facewindu

+0

好吧,你確實幫了我。一旦將該系列添加到圖表,getNode()方法將返回正確的節點。所以我設法將setId中的Id應用於該系列。謝謝 – facewindu

+0

不客氣,註冊我會編輯我的答案。 – Math