对于下面的MVCE,如何在饼图中的每个饼上添加一个标签,显示其总馅饼的百分比?在JavaDoc中,他们只在值后添加%,这不是任何解决方案。
public class PieChartSample extends Application {
@Override public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Imported Fruits");
stage.setWidth(500);
stage.setHeight(500);
ObservableList<PieChart.Data> pieChartData =
FXCollections.observableArrayList(
new PieChart.Data("Grapefruit", 13),
new PieChart.Data("Oranges", 25),
new PieChart.Data("Plums", 10),
new PieChart.Data("Pears", 22),
new PieChart.Data("Apples", 30));
final PieChart chart = new PieChart(pieChartData);
chart.setTitle("Imported Fruits");
((Group) scene.getRoot()).getChildren().add(chart);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:3)
您所要做的就是遍历饼图数据并将值相加以获得总数。然后将当前值除以总数。
从您提供的链接调整(糟糕)示例:
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class PieChartSample extends Application {
@Override public void start(Stage stage) {
Pane root = new Pane();
Scene scene = new Scene(root);
stage.setTitle("Imported Fruits");
stage.setWidth(500);
stage.setHeight(500);
ObservableList<PieChart.Data> pieChartData =
FXCollections.observableArrayList(
new PieChart.Data("Grapefruit", 13),
new PieChart.Data("Oranges", 25),
new PieChart.Data("Plums", 10),
new PieChart.Data("Pears", 22),
new PieChart.Data("Apples", 30));
final PieChart chart = new PieChart(pieChartData);
chart.setTitle("Imported Fruits");
final Label caption = new Label("");
caption.setTextFill(Color.DARKORANGE);
caption.setStyle("-fx-font: 24 arial;");
for (final PieChart.Data data : chart.getData()) {
data.getNode().addEventHandler(MouseEvent.MOUSE_PRESSED,
e -> {
double total = 0;
for (PieChart.Data d : chart.getData()) {
total += d.getPieValue();
}
caption.setTranslateX(e.getSceneX());
caption.setTranslateY(e.getSceneY());
String text = String.format("%.1f%%", 100*data.getPieValue()/total) ;
caption.setText(text);
}
);
}
root.getChildren().addAll(chart, caption);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
如果您想避免每次鼠标事件时重新计算总数,您可以创建DoubleBinding
来存储它:
DoubleBinding total = Bindings.createDoubleBinding(() ->
pieChartData.stream().collect(Collectors.summingDouble(PieChart.Data::getPieValue)), pieChartData);
然后只是
for (final PieChart.Data data : chart.getData()) {
data.getNode().addEventHandler(MouseEvent.MOUSE_PRESSED,
e -> {
caption.setTranslateX(e.getSceneX());
caption.setTranslateY(e.getSceneY());
String text = String.format("%.1f%%", 100*data.getPieValue()/total.get()) ;
caption.setText(text);
}
);
}