首页 > 解决方案 > 不同的条形颜色 JavaFX 图表

问题描述

有没有办法为同一 dataSeries 中的条设置不同的颜色?我知道如何在不同的数据系列中设置不同的颜色,但我想知道我是否可以在同一个数据系列中做到这一点。

标签: javajavafx

解决方案


这个答案是为了表明它可以做到。我从这里更改了答案。

关键是获取Node系列中的每一个并使用setStyle.

关键代码:

chartA.getData().forEach((series) - > {
    AtomicInteger counter = new AtomicInteger();
    series.getData().forEach((t) - > {
        switch (counter.getAndIncrement()) {
            case 0:
                t.getNode().setStyle("-fx-bar-fill: firebrick;");
                break;
            case 1:
                t.getNode().setStyle("-fx-bar-fill: green;");
                break;
            case 2:
                t.getNode().setStyle("-fx-bar-fill: blue;");
                break;
        }

    });
});

完整代码:

import java.util.concurrent.atomic.AtomicInteger;
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 App 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);
        chartA.getData().forEach((series) -> {
            AtomicInteger counter = new AtomicInteger();
            series.getData().forEach((t) -> {
                switch (counter.getAndIncrement()) {
                    case 0:
                        t.getNode().setStyle("-fx-bar-fill: firebrick;");
                        break;
                    case 1:
                        t.getNode().setStyle("-fx-bar-fill: green;");
                        break;
                    case 2:
                        t.getNode().setStyle("-fx-bar-fill: blue;");
                        break;
                }

            });
        });

    }

    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);
    }

}

在此处输入图像描述

注意:我只对 ChartA 进行了更改。


推荐阅读