JavaFX的:设定AreaChart颜色,而不依赖于顺序

时间:2019-01-31 19:41:26

标签: css javafx

我有一个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()的各个节点上,但它从未有任何影响;原来的红色和黑色留下了。我想我对建议的理解不正确?

0 个答案:

没有答案