我有一个ObservableList<Series<Number, Number>>
,我在我绘制AreaChart
。这是由ImmutableMap<String, ImmutableList<XY>>
构造的。我有一个.css文件,其中包含10种颜色,例如:
.default-color0.chart-legend-item-symbol { -fx-background-color: #d46d00;}
.default-color0.chart-series-line {-fx-stroke: #d46d00;}
.default-color0.chart-series-area-line {-fx-stroke: #d46d00;}
.default-color0.chart-series-area-fill {-fx-fill: #d46d00;}
.default-color1.chart-legend-item-symbol { -fx-background-color: #000000;}
.default-color1.chart-series-line {-fx-stroke: #000000;}
.default-color1.chart-series-area-line {-fx-stroke: #000000;}
.default-color1.chart-series-area-fill {-fx-fill: #000000;}
我想做的是拥有一个ImmutableMap<String, Color>
,我可以使用它来根据“系列”标签设置每个系列的颜色,但是afaik不可能在代码中更改颜色,我必须使用CSS。
有没有一种方法可以编写CSS以根据标签为每个系列选择颜色,或者以其他方式给每个自定义变量名称以用于选择绘图中的颜色?
更新:我提供了一种MWE,其中我尝试实施下面的建议
。(为了使MWE正常工作,不得不问一个单独的问题:CSS+JavaFX: Could not resolve X while resolving lookups for Y最终我通过在CSS的根中添加*来解决它)
dummy.css:
.root * {
-chart0-color: red;
-chart1-color: black;
}
.default-color0.chart-legend-item-symbol { -fx-background-color: -chart0-color;}
.default-color0.chart-series-line {-fx-stroke: -chart0-color;}
.default-color0.chart-series-area-line {-fx-stroke: -chart0-color;}
.default-color0.chart-series-area-fill {-fx-fill: -chart0-color;}
.default-color1.chart-legend-item-symbol { -fx-background-color: -chart1-color;}
.default-color1.chart-series-line {-fx-stroke: -chart1-color;}
.default-color1.chart-series-area-line {-fx-stroke: -chart1-color;}
.default-color1.chart-series-area-fill {-fx-fill: -chart1-color;}
CSSAreaChartMWE.java:
package csstest;
import java.util.function.Function;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class CSSAreaChartMWE extends Application {
private ObservableList<XYChart.Data<Number, Number>> functionToData(Function<Double, Double> f, double minx, double maxx) {
ObservableList<XYChart.Data<Number, Number>> list = FXCollections.observableArrayList();
double dx = (maxx-minx)/(100);
double x = minx;
while (x < maxx) {
list.add(new XYChart.Data<>(x, f.apply(x))); x+=dx;
}
return list;
}
@Override
public void start(Stage primaryStage) throws Exception {
double minx = 0;
double maxx = 6*Math.PI;
double amp = 5;
double period = (maxx-minx)/6;
Series<Number, Number> sin = new Series<>("sin", functionToData((x) -> amp*Math.sin(x/period), minx, maxx));
Series<Number, Number> cos = new Series<>("cos", functionToData((x) -> amp*Math.cos(x/period), minx, maxx));
ObservableList<Series<Number, Number>> series = FXCollections.observableArrayList();
series.add(sin);
series.add(cos);
NumberAxis xAxis = new NumberAxis();
NumberAxis yAxis = new NumberAxis();
AreaChart chart = new AreaChart(xAxis, yAxis, series);
chart.setCreateSymbols(false);
chart.getStylesheets().add(getClass().getResource("dummy.css").toExternalForm());
VBox box = new VBox();
box.getChildren().add(chart);
Scene scene = new Scene(box);
primaryStage.setScene(scene);
primaryStage.show();
chart.setStyle("-chart1-color: pink; -chart2-color: green");
box.setStyle("-chart1-color: orange; -chart2-color: blue");
primaryStage.getScene().getRoot().setStyle("-chart1-color: darkgrey; -chart2-color: lightgrey");
primaryStage.show();
}
public static void main(String [] args) {
launch(args);
}
}
我试图setStyle()
的各个节点上,但它从未有任何影响;原来的红色和黑色留下了。我想我对建议的理解不正确?