更改条形图图例中的颜色

彼得·彭佐夫

我成功测试了此代码,以更改条形图列的颜色:

XYChart.Data<String, Number> dataS1 = new XYChart.Data<>();
            dataS1.nodeProperty().addListener(new ChangeListener<Node>()
            {
                @Override
                public void changed(ObservableValue<? extends Node> ov, Node oldNode, Node newNode)
                {
                    if (newNode != null)
                    {
                        if (dataS1.getYValue().intValue() > 8)
                        {
                            newNode.setStyle("-fx-bar-fill: navy;");
                        }
                        else if (dataS1.getYValue().intValue() > 5)
                        {
                            newNode.setStyle("-fx-bar-fill: firebrick;");
                        }
                    }
                }
            });

但是事实证明,图例的颜色没有改变。有没有不用传统的CSS文件就可以做到这一点的方法?如果可能的话,我想使用上述方法。

何塞·佩雷达(Jose Pereda)

假设您有一个系列,图例将包含一个项目。

如果您根据某个值更改图表中项目的颜色,则根据您的条件将有三种不同的颜色。

这意味着您需要在图例上包含三个不同的项目。

一种可能的方法是使用其他类型的图表,例如LineChart,为每个条形图绘制彩色线。这样的问题是,对于每个栏,您都会创建一个新系列,因此图例将包含与系列一样多的项目。

其他方法将使用单个系列,但在图例中添加所需数量的项。

请注意,在这两种情况下,您都必须处理私有API,因为Legend它不是公开的,并且众所周知,这是不明智的,因为它可能随时更改。

对于第一种方法,请看一下这个问题

对于第二个,这是一个非常简单的工作片段:

@Override 
public void start(Stage stage) {
    NumberAxis yAxis = new NumberAxis();
    CategoryAxis xAxis = new CategoryAxis();
    BarChart<String,Number> barChart = new BarChart<>(xAxis,yAxis);
    barChart.setTitle("Tricolored BarChart");
    yAxis.setLabel("Value");

    XYChart.Series<String,Number> series1 = new XYChart.Series();
    series1.getData().add(new XYChart.Data("Item 1", 7.5));
    series1.getData().add(new XYChart.Data("Item 2", 2.3));
    series1.getData().add(new XYChart.Data("Item 3", 8.5));
    series1.getData().add(new XYChart.Data("Item 4", 4.8));      
    series1.getData().add(new XYChart.Data("Item 5", 13.5));      
    series1.getData().add(new XYChart.Data("Item 6", 6.5));      

    Scene scene  = new Scene(barChart,600,400);
    barChart.getData().addAll(series1);
    stage.setScene(scene);
    stage.show();

    series1.getData().forEach(d->
            d.getNode().setStyle("-fx-bar-fill: "
                    .concat(d.getYValue().floatValue()>8?"navy;":
                            d.getYValue().floatValue()>5?"firebrick;":"orange")));
    Legend legend = (Legend)barChart.lookup(".chart-legend");
    Legend.LegendItem li1=new Legend.LegendItem("Over 8", new Rectangle(10,4,Color.NAVY));
    Legend.LegendItem li2=new Legend.LegendItem("Over 5 up to 8", new Rectangle(10,4,Color.FIREBRICK));
    Legend.LegendItem li3=new Legend.LegendItem("Below 5", new Rectangle(10,4,Color.ORANGE));
    legend.getItems().setAll(li1,li2,li3);
}

这将是结果:

传奇

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章