2015-03-09 5 views
0

Для MVCE внизу, как вы можете добавить ярлык на каждый пирог в piechart, который показывает его процент от общего пирога? В JavaDoc они добавляют только% после значения, которое не является решением.Показать пироги процент от PieChart

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

Можете ли вы прояснить этот вопрос? Ссылка, которую вы указали, показывает, как рекламировать ярлык: не нужно просто делить значение на общую сумму, чтобы получить процент? –

+0

@James_D Ye, как вы говорите математически, вам просто нужно разделить значение на общую сумму. Есть ли способ сделать это в JavaFX легко, если нет, как? – miniHessel

ответ

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); 
      } 
      ); 
    } 
Смежные вопросы