JavaFX BarChart, Set Series Color by Series Name

前端 未结 1 1502
别跟我提以往
别跟我提以往 2020-12-18 11:23

I am trying to dynamically set the BarChart Series color.

I want to have always the same color for the same Series name. I

相关标签:
1条回答
  • 2020-12-18 11:49

    Try this:

    import com.sun.javafx.charts.Legend;
    import com.sun.javafx.charts.Legend.LegendItem;
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.scene.Node;
    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.chart.XYChart.Data;
    import javafx.scene.chart.XYChart.Series;
    import javafx.scene.control.Label;
    import javafx.stage.Stage;
    
    public class BarChartSample extends Application {
        final static String austria = "Austria";
        final static String brazil = "Brazil";
        final static String france = "France";
        final static String italy = "Italy";
        final static String usa = "USA";
    
        @Override public void start(Stage stage) {
            stage.setTitle("Bar Chart Sample");
            final CategoryAxis xAxis = new CategoryAxis();
            final NumberAxis yAxis = new NumberAxis();
            final BarChart<String,Number> bc = new BarChart(xAxis,yAxis);
            bc.setTitle("Country Summary");
            xAxis.setLabel("Country");       
            yAxis.setLabel("Value");
    
            XYChart.Series series1 = new XYChart.Series();
            series1.setName("2003");       
            series1.getData().add(new XYChart.Data(austria, 25601.34));
            series1.getData().add(new XYChart.Data(brazil, 20148.82));
            series1.getData().add(new XYChart.Data(france, 10000));
            series1.getData().add(new XYChart.Data(italy, 35407.15));
            series1.getData().add(new XYChart.Data(usa, 12000));      
    
            XYChart.Series series2 = new XYChart.Series();
            series2.setName("2004");
            series2.getData().add(new XYChart.Data(austria, 57401.85));
            series2.getData().add(new XYChart.Data(brazil, 41941.19));
            series2.getData().add(new XYChart.Data(france, 45263.37));
            series2.getData().add(new XYChart.Data(italy, 117320.16));
            series2.getData().add(new XYChart.Data(usa, 14845.27));  
    
            XYChart.Series series3 = new XYChart.Series();
            series3.setName("2005");
            series3.getData().add(new XYChart.Data(austria, 45000.65));
            series3.getData().add(new XYChart.Data(brazil, 44835.76));
            series3.getData().add(new XYChart.Data(france, 18722.18));
            series3.getData().add(new XYChart.Data(italy, 17557.31));
            series3.getData().add(new XYChart.Data(usa, 92633.68));  
    
            Scene scene  = new Scene(bc,800,600);
            bc.getData().addAll(series1, series2, series3);
            stage.setScene(scene);
            stage.show();
    
            //Used to change series color.
            for (XYChart.Series<String, Number> series : bc.getData()) {
                if(series.getName().equals("2003"))
                {
                    System.out.println("Series name: " + series.getName());
                    for(Data data : series.getData())
                    {
                        data.getNode().setStyle("-fx-bar-fill: firebrick;");
                    }                        
                }                    
            }
    
            //Used to change legend color
            for(Node n : bc.getChildrenUnmodifiable())
            {
                if(n instanceof Legend)
                {
                    System.out.println(((Legend)n).getItems());
                    for(LegendItem items : ((Legend)n).getItems())
                    {
                        System.out.println("Legend item text: " + items.getText());
                        if(items.getText().equals("2003"))
                        {
                            items.getSymbol().setStyle("-fx-bar-fill: firebrick;");
                        }
                    }
                }
            }
    
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
    }
    

    For Java 10 and Above replace the Used to change legend color code with code below. Not tested on Java 9

    //Used to change legend color
    for(Node node : bc.lookupAll("Label.chart-legend-item"))
    {
        Label tempLabel = (Label)node;
        if(tempLabel.getText().equals("2003"))
        {
            tempLabel.getGraphic().setStyle("-fx-bar-fill: firebrick;");
        }           
    }
    

    This app changes the 2003 series color to firebrick. The for loop is the part you should focus on.

    UPDATE I added a way to change the legend color.

    UPDATE 08/08/2019 The original code works for Java 8. I am adding code for Java 10 and above.

    0 讨论(0)
提交回复
热议问题