繁体   English   中英

如何为 JavaFX 图表系列着色

[英]How to color JavaFX chart series

如何设置左侧图表和右侧图表上的条形颜色?

假设左侧图表应包含所有绿色条,右侧图表应包含所有红色条。

我希望 CSS 是内联的,而不是在单独的文件中。

public class SideBySideChart2 extends Application {

    HBox root = new HBox();

    @Override
    public void start(Stage primaryStage) throws Exception {

        BarChart<String, Number> chartA = createChart();
        BarChart<String, Number> chartB = createChart();

        root.getChildren().addAll(chartA, chartB);

        Scene scene = new Scene(root, 400, 200);
        primaryStage.setScene(scene);
        primaryStage.setHeight(600);
        primaryStage.setWidth(400);
        primaryStage.show();

        populateCharts(chartA, chartB);
    }

    private BarChart<String, Number> createChart() {
        final CategoryAxis xAxis = new CategoryAxis();
        final NumberAxis yAxis = new NumberAxis(0, 100, 1);
        yAxis.setTickUnit(1);
        yAxis.setPrefWidth(35);
        yAxis.setMinorTickCount(10);
        yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) {
            @Override
            public String toString(Number object) {
                String label;
                label = String.format("%7.2f", object.floatValue());
                return label;
            }
        });

        final BarChart<String, Number> chart = new BarChart<String, Number>(xAxis, yAxis);

        return chart;
    }

    private void populateCharts(BarChart<String,Number> chartA, BarChart<String,Number> chartB) {

        XYChart.Series seriesA = new XYChart.Series();

        seriesA.getData().add(new XYChart.Data("310", 100));
        seriesA.getData().add(new XYChart.Data("305", 4));
        seriesA.getData().add(new XYChart.Data("300", 2.5));

        chartA.getData().addAll(seriesA);

        XYChart.Series seriesB = new XYChart.Series();

        seriesB.getData().add(new XYChart.Data("300", 1));
        seriesB.getData().add(new XYChart.Data("305", 4));
        seriesB.getData().add(new XYChart.Data("310", 2.5));

        chartB.getData().addAll(seriesB);
    }


    public static void main(String[] args) {
        Application.launch(args);
    }

} 

一种方法是使用CSS 请参阅以供参考。 要完成这项工作,您需要对数据进行排序。 然后将排序后的数据添加到图表中。 然后使用CSS根据它在图表中的位置设置条形的颜色。

主要的

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class TestingGround extends Application
{

    HBox root = new HBox();

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        BarChart<String, Number> chartA = createChart();
        BarChart<String, Number> chartB = createChart();

        root.getChildren().addAll(chartA, chartB);

        Scene scene = new Scene(root, 400, 200);
        scene.getStylesheets().add("testingground/chartcss.css");
        primaryStage.setScene(scene);
        primaryStage.setHeight(600);
        primaryStage.setWidth(400);
        primaryStage.show();

        populateCharts(chartA, chartB);
    }

    private BarChart<String, Number> createChart()
    {
        final CategoryAxis xAxis = new CategoryAxis();
        final NumberAxis yAxis = new NumberAxis(0, 100, 1);
        yAxis.setTickUnit(1);
        yAxis.setPrefWidth(35);
        yAxis.setMinorTickCount(10);
        yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis)
        {
            @Override
            public String toString(Number object)
            {
                String label;
                label = String.format("%7.2f", object.floatValue());
                return label;
            }
        });

        final BarChart<String, Number> chart = new BarChart(xAxis, yAxis);

        chart.setAlternativeRowFillVisible(false);
        chart.setLegendVisible(false);
        chart.setAnimated(false);

        chart.prefWidthProperty().bind(this.root.widthProperty().multiply(0.5));
        chart.prefHeightProperty().bind(this.root.heightProperty());
        chart.minHeightProperty().bind(this.root.heightProperty());

        // Set this so axis bounds can be set manually.
        yAxis.setAutoRanging(false);

        return chart;
    }

    private void populateCharts(BarChart<String, Number> chartA, BarChart<String, Number> chartB)
    {

        XYChart.Series seriesA = new XYChart.Series();

        //data sorted!
        seriesA.getData().add(new XYChart.Data("300", 2.5));
        seriesA.getData().add(new XYChart.Data("305", 4));
        seriesA.getData().add(new XYChart.Data("310", 100));



        chartA.getData().addAll(seriesA);

        XYChart.Series seriesB = new XYChart.Series();
        //sorted data!
        seriesB.getData().add(new XYChart.Data("300", 1));
        seriesB.getData().add(new XYChart.Data("305", 4));
        seriesB.getData().add(new XYChart.Data("310", 2.5));

        chartB.getData().addAll(seriesB);
    }

    public static void main(String[] args)
    {
        Application.launch(args);
    }

}

CSS

data0.chart-bar {
    -fx-background-color: #ffd700;
}
.data1.chart-bar {
    -fx-background-color: #ffa500;
}
.data2.chart-bar {
    -fx-background-color: #860061;
}

结果:

在此处输入图片说明

更新:

进行更新的最简单方法是遍历每个节点并设置其颜色。 这段代码应该populateCharts(chartA, chartB);

    populateCharts(chartA, chartB);
    chartA.getData().get(0).getData().forEach((item) -> {
        item.getNode().setStyle("-fx-background-color: red");
    });
    chartB.getData().get(0).getData().forEach((item) -> {
        item.getNode().setStyle("-fx-background-color: green");
    });

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM