2016-06-04 2 views
0

Я хочу динамически изменять цвета диаграмм разных типов, используя colorpicker. Затем я сделал пример кода для круговой диаграммы.Динамически менять цвета диаграммы с помощью colorpicker

Цвет слушателю выбора действия:

 colorPicker.setOnAction(event -> {   

     Node node = chart.lookup(".default-color0.chart-pie"); 
     String str = "-fx-pie-color:" + toRGBCode(colorPicker.getValue()) + ";"; 

     node.setStyle(str); 
    }); 

CSS файл:

.default-color0.chart-pie { -fx-pie-color: #ffd700; } 
.default-color1.chart-pie { -fx-pie-color: #ffa500; } 
.default-color2.chart-pie { -fx-pie-color: #860061; } 
.default-color3.chart-pie { -fx-pie-color: #adff2f; } 
.default-color4.chart-pie { -fx-pie-color: #ff5700; } 

Он отлично работает, но только частично. Проблема в том, что когда я меняю цвет, легенда диаграммы не следует за ней. Как динамически обновлять легенду?

Screenshot

ответ

0

Вы можете обновить легенду, получив его после того, как он был разработан с помощью поиска узла, а затем изменив свой стиль, похожий на то, что вы уже сделали в вопросе

Этот ответ построен на что вы предоставили так что есть предположение, вы знаете, какой элемент вы хотите обновить, как вы знаете, класс стиля в этой строке:

Node node = chart.lookup(".default-color0.chart-pie"); 

так что с виду, вы можете сделать что-то подобное со следующим:

public static void updateChartLegendColorFromItemName(Chart chart, String itemToUpdate, Color legendColor){ 
     Set<Node> legendItems = chart.lookupAll("Label.chart-legend-item"); 
     if(legendItems.isEmpty()){ return; } 
     String styleString = "-fx-background-color:" + toRGBCode(legendColor) + ";"; 
     for(Node legendItem : legendItems){ 
      Label legendLabel = (Label) legendItem; 
      Node legend = legendLabel.getGraphic(); //The legend icon (circle by default) 

      if(legend != null && legendLabel.getText().equals(itemToUpdate)){ 
       legend.setStyle(styleString); 
      } 
     } 
    } 

Пример использование от того, что вы предоставили бы:

colorPicker.setOnAction(event -> { 
      Node node = chart.lookup(".default-color0.chart-pie"); 
      String styleString = "-fx-background-color:" + toRGBCode(colorPicker.getValue()) + ";"; 
      node.setStyle(styleString); 
      updateChartLegendColorFromItemName(chart, "Sunday", colorPicker.getValue()); 
     }); 

Надеется, что это помогает

0

Существует частный метод 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 не был разработан, чтобы легко достичь того, что вам нужно.