Существует частный метод updateLegend()
в PieChart
классе, который вызывается, когда данные диаграммы или их имена изменены. Этот метод создает новые элементы легенды для каждого PieChart.Data
объекта и загружает их стили из styleClass объекта обработки данных:
for (Data item : getData()) {
LegendItem legenditem = new LegendItem(item.getName());
legenditem.getSymbol().getStyleClass().addAll(item.getNode().getStyleClass());
legenditem.getSymbol().getStyleClass().add("pie-legend-symbol");
legend.getItems().add(legenditem);
}
Это означает, что вызов setStyle()
на объектах данных графика не будет иметь никакого влияния на цвете легенды. Вы можете попытаться изменить объекты легенды напрямую, но ваши изменения, вероятно, будут отменены в следующий раз, когда вызывается updateLegend(), если вы не измените класс стиля узла пирога, который вы изменили. Ниже приведен пример того, как изменить цвет первого пирога и его легенда пункта к цвету, который уже определен в таблице стилей (например, цвет второго пирога):
// reference to the first pie's node
Node node = chart.lookup(".default-color0.chart-pie");
// the default-color property is in the third line. It is defined by
// updateDataItemStyleClass(final Data item, int index) method in PieChart class
node.getStyleClass().set(2, "default-color1");
// we have to trigger some change so updateLegend() is called:
String name0 = pieChartData.get(0).getName();
pieChartData.get(0).setName("");
pieChartData.get(0).setName(name0);
Чтобы сделать этот метод для вашей цели вам нужно будет обновить свой файл CSS (или создать другой) в вашем обработчике ColorPicker
. Я не знаю, можно ли создавать новые определения стилей без создания/изменения файлов CSS во время выполнения. Решение определенно не выглядит элегантным, но похоже, что JavaFX не был разработан, чтобы легко достичь того, что вам нужно.