Постоянные цвета на круговой диаграмме

1

У меня есть JavaFX PieChart, и я хочу иметь цвет, связанный с конкретными регионами. Однако кажется, что я могу иметь только цвета, связанные с порядком добавления Data в диаграмму. Например, если я хочу отображать цвета автомобилей на стоянке, я мог бы это сделать:

.default-color0.chart-pie { -fx-pie-color: #FF0000; }
.default-color1.chart-pie { -fx-pie-color: #00FF00; }
.default-color2.chart-pie { -fx-pie-color: #0000FF; }
.default-color3.chart-pie { -fx-pie-color: #FFFF00; }
.default-color4.chart-pie { -fx-pie-color: #00FFFF; }

Пока я сначала добавляю данные "красной машины", а затем данные "зеленого автомобиля" и т.д., Все в порядке. Но если нет красных автомобилей, и я не добавляю эти данные, тогда зеленые автомобили становятся красными, так как они являются первой точкой данных. Я мог бы добавить Data("Red", 0), но затем он появляется в моем PieChart как срез с нулевой областью, но у него все еще есть метка, и это может сбивать с толку. Есть ли способ избежать этого? Либо отмечать объекты Data с нулевыми данными как невидимые, либо назначать постоянные цвета для категорий?

  • 0
    Похоже, что было бы лучше установить эти значения по коду и при добавлении данных. Итак, вы знаете, что цвет соответствует данным.
  • 0
    Получить узел и изменить его цвет. stackoverflow.com/a/15236593/2855515
Показать ещё 4 комментария
Теги:
javafx
charts

2 ответа

1

Хорошо, вот что я в итоге сделал (и это работает):

Platform.runLater(new Runnable() {
  @Override
  public void run() {
    for (int i = 0; i < usedColors.size(); i++) {
      for (Node node : chart.lookupAll(String.format(".default-color%d.chart-pie", i))) {
        node.setStyle(String.format("-fx-pie-color: #%06x;", usedColors.get(i)));
      }
    }
  }
});

Где usedColors - это список, содержащий правильные цвета в порядке. Это повлияет и на легенду. Использование runLater необходимо.

И спасибо всем в комментариях за вашу помощь.

  • 0
    Спасибо, я никогда не ожидал, что только использование Platform.runLater () может решить эту проблему. Я потратил пару часов на эту проблему. Большое спасибо.
0

Ваше решение по-прежнему просто добавляет элементы в порядок цветов. Нетрудно получить ссылку на легенду. Невозможно добавить цвет в PieChart.Data, но вы можете создать свой собственный класс.

import com.sun.javafx.charts.Legend;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class CustomPie extends Application {
    public static void main(String[] args) {launch(args);}

    @Override
    public void start(Stage primaryStage) {
        PieData pieData = new PieData();
        pieData.add(new PieChart.Data("Grapefruit", 13d), Color.AQUA);
        pieData.add(new PieChart.Data("Oranges", 25d), Color.ALICEBLUE);
        pieData.add(new PieChart.Data("Plums", 10d), Color.AQUAMARINE);
        pieData.add(new PieChart.Data("Pears", 22d), Color.BLUE);
        pieData.add(new PieChart.Data("Apples", 30d), Color.BLUEVIOLET);

        final MyPie pieChart = new MyPie(pieData.pieChartData);
        Scene scene = new Scene(new VBox(pieChart));
        primaryStage.setScene(scene);
        primaryStage.show();

        for (PieChart.Data data : pieData.pieChartData) {
            int idx = pieData.pieChartData.indexOf(data);
            Color color = pieData.pieChartColors.get(idx);
            data.getNode().setStyle("-fx-pie-color: " + color.toString().replace("0x", "#") + ";");
            pieChart.legend.getItems().get(idx).setSymbol(new Rectangle(8, 8, color));
        }
    }
}

class MyPie extends PieChart {
    public Legend legend;

    public MyPie(ObservableList<PieChart.Data> pieChartData) {
        super(pieChartData);
        legend = (Legend) getLegend();
    }
}

class PieData {
    ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList();
    ObservableList<Color> pieChartColors = FXCollections.observableArrayList();

    public void add(PieChart.Data data, Color color){
        pieChartData.add(data);
        pieChartColors.add(color);
    }
}

Я не проверял, запутывает ли это добавление/удаление данных, но структура данных может быть улучшена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню