我有一个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 :(得分: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
是包含正确颜色的List。这也会影响图例。使用runLater是必要的。
感谢评论中的每个人的帮助。
答案 1 :(得分: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);
}
}
我没有检查添加/删除数据是否会混淆它,但数据结构可以改进。