0

我有一些包含各种系列的 StackedBarChart。

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 文件中,我可以用 sth like 覆盖默认颜色

.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");

这样即使该系列在图表中以不同的顺序插入,它们仍然可以获得我想要的颜色

4

1 回答 1

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 并为 java 组件设置 CSS id:

CSS

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

爪哇

series1.getNode().setId("clr1");
series2.getNode().setId("clr2");
series3.getNode().setId("clr3");
于 2013-12-13T18:38:02.660 回答