Все, что вам нужно сделать, это перебирать данные диаграммы пироги и сложить значения, чтобы получить общее количество. Затем разделите текущее значение на общее.
Адаптирование (ужасный) пример по ссылке вы предоставили:
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);
}
);
}
Можете ли вы прояснить этот вопрос? Ссылка, которую вы указали, показывает, как рекламировать ярлык: не нужно просто делить значение на общую сумму, чтобы получить процент? –
@James_D Ye, как вы говорите математически, вам просто нужно разделить значение на общую сумму. Есть ли способ сделать это в JavaFX легко, если нет, как? – miniHessel