У меня есть ObservableList<Series<Number, Number>>
, который я строю в AreaChart
.Это построено из ImmutableMap<String, ImmutableList<XY>>
.У меня есть файл .css, который содержит десять цветов, таких как:
.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>
, который я мог бы использовать, чтобы установить цвет каждой серии в соответствии с меткой серии., но на самом деле невозможно изменить цвета в коде, у меня есть для использования CSS.
Есть ли способ написать CSS, чтобы выбрать цвета для каждой серии на основена ярлыке или иным образом присваивайте каждому имя пользовательской переменной, которую можно использовать для выбора цвета на графике?
Обновление: я предоставил MWE, в котором я пытаюсь реализовать приведенные ниже рекомендации.
(Нужно было задать отдельный вопрос только для того, чтобы MWE работал: CSS + JavaFX: не удалось разрешить X при разрешении поиска для 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()
на разных узлах, но это никогда не оказывало никакого эффекта;оригинальный красный и черный остались.Я полагаю, я не правильно понимаю предложение?