Javafx 2 JavaFX2.0-如何动态更改折线图的图例颜色?

Javafx 2 JavaFX2.0-如何动态更改折线图的图例颜色?,javafx-2,Javafx 2,我正在尝试设计我的JavaFX折线图,但我在图例方面遇到了一些问题 我知道如何更改css文件中折线图的图例颜色: .default-color0.chart-series-line{-fx stroke:#FF0000,白色;} .default-color1.chart-series-line{-fx笔划:#00FF00,白色;} .default-color2.chart-series-line{-fx笔划:#0000FF,白色;} .default-color0.chart-line-sy

我正在尝试设计我的JavaFX折线图,但我在图例方面遇到了一些问题

我知道如何更改css文件中折线图的图例颜色:

.default-color0.chart-series-line{-fx stroke:#FF0000,白色;}
.default-color1.chart-series-line{-fx笔划:#00FF00,白色;}
.default-color2.chart-series-line{-fx笔划:#0000FF,白色;}

.default-color0.chart-line-symbol{-fx背景色:#FF0000,白色;}
.default-color1.chart-line-symbol{-fx背景色:#00FF00,白色;}
.default-color2.chart-line-symbol{-fx背景色:#0000FF,白色;}

但这对我来说还不够。我有三个或更多的彩色切换按钮和每个按钮的一系列数据。在我选择按钮后,数据应以与按钮相同的颜色显示。这应该可以通过多个按钮的选择来实现,以便同时显示多个系列的数据

对于图表行,我在单击按钮后通过更改样式进行管理:


添加(系列)
..
series.getNode().setStyle(“-fx笔划:rgba(“+rgba+”)”)

如果我取消选择按钮,我将从列表中删除数据

dataList.remove(系列)

这对笔划来说很好,但是我怎么能对图例做同样的事情呢

您可以看到下面的示例。首先我单击了红色按钮,因此笔划和图例是红色的(默认为-color0)。之后,我点击了蓝色按钮。在这里你可以看到问题所在。笔划为蓝色,但图例为绿色,因为使用了默认颜色1,我不知道如何更改图例颜色


看来guy能够使用其类查找用于legend的节点,然后在这些节点上调用setStyle()。(我认为他的问题与你的问题无关)

我也遇到了这个问题。问题似乎在于,将数据系列添加到图表中时,图例不会同时更新,因此当您查找具有该seriesN样式类的组件时,它们还不存在。提出了一个解决方案,可以检测何时创建图例项,以便可以向其添加动态样式

我在图表图例的“getChildrenUnmodifiable()”ObservableList中添加了一个ListChangeListener,这反过来又在图例的每个子项被添加时为它们添加一个ListChangeListener。在这个监听器中,我们可以知道何时向图例中添加(或删除)新项目。这样我们就可以进行动态样式更改

for (Node n : lineChart.getChildrenUnmodifiable())
    {
        if (n instanceof Legend)
        {
            final Legend legend = (Legend) n;

            // remove the legend
            legend.getChildrenUnmodifiable().addListener(new ListChangeListener<Object>()
            {
                @Override
                public void onChanged(Change<?> arg0)
                {
                    for (Node node : legend.getChildrenUnmodifiable())
                    {
                        if (node instanceof Label)
                        {
                            final Label label = (Label) node;
                            label.getChildrenUnmodifiable().addListener(new ListChangeListener<Object>()
                            {
                                @Override
                                public void onChanged(Change<?> arg0)
                                {
                                    //make style changes here
                                }

                            });
                        }
                    }
                }
            });
        }
    }
(节点n:lineChart.getChildrenUnmodifiable())的

{
if(图例的n个实例)
{
最终图例=(图例)n;
//删除图例
legend.getChildrenUnmodifiable().addListener(新ListChangeListener())
{
@凌驾
更改后的公共void(更改arg0)
{
for(节点:legend.getChildrenUnmodifiable())
{
if(标签的节点实例)
{
最终标签=(标签)节点;
label.getChildrenUnmodifiable().addListener(新ListChangeListener())
{
@凌驾
更改后的公共void(更改arg0)
{
//在此处更改样式
}
});
}
}
}
});
}
}

为了便于将来参考,可以通过在调用
Platform.runLater()
时包装相关代码来解决此问题。例如:

LineChart<Number, Number> plot;
....
Platform.runLater(() -> {
    Node nl = plot.lookup(".default-color0.chart-series-line");
    Node ns = plot.lookup(".default-color0.chart-line-symbol");

    nl.setStyle("-fx-stroke: #333;");
    ns.setStyle("-fx-background-color: #333, white;");
}); 
LineChart图;
....
Platform.runLater(()->{
节点nl=plot.lookup(“.default-color0.chart系列线”);
Node ns=plot.lookup(“.default-color0.图表线符号”);
nl.setStyle(“-fx冲程:#333;”);
ns.setStyle(“-fx背景色:#333,白色;”);
}); 

此解决方案基于@Chris'解决方案

 if (checkCombo.getCheckModel().isChecked(0)) {
    lineChart.getData().add(seriesTest1);
    changeColorSeries(lineChart.getData().size() - 1, "darkgreen");
 }

 if (checkCombo.getCheckModel().isChecked(3)) {
    lineChart.getData().add(seriesTest2);
    changeColorSeries(lineChart.getData().size() - 1, "darkred");
 }

 private void changeColor(int position, String color) {
        Platform.runLater(() -> {
            Node nl = lineChart.lookup(".default-color" + position + ".chart-series-line");
            Node ns = lineChart.lookup(".default-color" + position + ".chart-line-symbol");
            Node nsl = lineChart.lookup(".default-color" + position + ".chart-legend-item-symbol");

            nl.setStyle("-fx-stroke: " + color + ";");
            ns.setStyle("-fx-background-color: " + color + ", white;");
            nsl.setStyle("-fx-background-color: " + color + ", white;");
        });
 }

你指的是字幕还是标签?万分感谢,我已经找了好几天了。也许是个愚蠢的问题,但我会添加样式更改吗?贴标签@Maxd非常感谢你!我在哪里可以找到JavaFX的所有这些神秘css?@Zeta.investor这是我用来作为参考的图。查找?@SamedSivaslıoğlu我已经调整了我的示例。Plot是线条图元素