2017-05-14 11 views
0

나는이 튜토리얼 ("원형 차트의 처리 마우스 이벤트"라고 하단에있는 섹션) 다음 해요 :각 파이 조각에 이벤트를 추가 한 후에 JavaFX PieChart 레이블이 표시되지 않는 이유는 무엇입니까? (자바 8)

https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/pie-chart.htm

를 다음과 같이 내 코드는 다음과 같습니다

@FXML 
public void initialize() { 
    pieChart.setTitle("Breakdown of Customers by City"); 
    pieChart.setLegendSide(Side.LEFT); 

    final Task<ObservableList<PieChart.Data>> task = new NumClientsAtLocationTask(new CustomerAccountDaoSelect()); 
    new Thread(task).start(); 
    task.setOnSucceeded(ae -> { 

     pieChart.setData(task.getValue()); 

     final Label caption = new Label(""); 
     caption.setTextFill(Color.DARKORANGE); 
     caption.setStyle("-fx-font: 24 arial;"); 

     for (final PieChart.Data data : pieChart.getData()) { 
      data.getNode().addEventHandler(MouseEvent.MOUSE_PRESSED, 
        ae2 -> { 
         caption.setTranslateX(ae2.getSceneX()); 
         caption.setTranslateY(ae2.getSceneY()); 
         caption.setText(String.valueOf(data.getPieValue())); 
        }); 
     } 
    }); 

} 


class NumClientsAtLocationTask extends Task<ObservableList<PieChart.Data>> { 
    private DaoSelect<CustomerAccount> customerAccountDaoSelect; 

    NumClientsAtLocationTask(DaoSelect<CustomerAccount> customerAccountDaoSelect) { 
     this.customerAccountDaoSelect = customerAccountDaoSelect; 
    } 

    @Override 
    protected ObservableList<PieChart.Data> call() throws Exception { 
     List<CustomerAccount> customerAccounts = customerAccountDaoSelect.select(RunListeners.FALSE); 

     Map<String, List<CustomerAccount>> customerMap = 
       customerAccounts 
         .stream() 
         .collect(Collectors.groupingBy(CustomerAccount::getCity)); 

     int london = customerMap.get("London").size(); 
     int phoenix = customerMap.get("Phoenix").size(); 
     int newYork = customerMap.get("New York").size(); 

     ObservableList<PieChart.Data> results = FXCollections.observableArrayList(
       new PieChart.Data("London", london), 
       new PieChart.Data("Phoenix", phoenix), 
       new PieChart.Data("New York", newYork)); 

     updateValue(results); 
     return results; 
    } 
} 

차트는 기본 형식으로 잘 표시되지만 슬라이스에서 마우스를 클릭하면 레이블이 나타나지 않습니다. 콘솔에 레이블을 인쇄하면 올바른 값을 표시합니다. 자습서와 같이 화면에 레이블이 나타나지 않습니다. 어떤 아이디어?

답변

1

예제/튜토리얼은 매우 좋지 않으며 중요한 세부 사항은 빠뜨립니다. 먼저 SceneLabel 'caption'을 추가해야합니다.

당신이 순수하게 그 튜토리얼의 예제 코드를 사용한 경우에는 ((Group) scene.getRoot()).getChildren().add(caption);을 포함 할 것 :

final Label caption = new Label(""); 
((Group) scene.getRoot()).getChildren().add(caption); // Add me 
caption.setTextFill(Color.DARKORANGE); 
caption.setStyle("-fx-font: 24 arial;"); 

for (final PieChart.Data data : chart.getData()) { 
    data.getNode().addEventHandler(MouseEvent.MOUSE_PRESSED, 
      new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent e) { 
        caption.setTranslateX(e.getSceneX()); 
        caption.setTranslateY(e.getSceneY()); 
        caption.setText(String.valueOf(data.getPieValue()) + "%"); 
       } 
      }); 
} 
+0

뜨아, 나는 레이블이 장면 노드 그래프의 일부가 될 필요가 있음을 간과. 나는 FXML 주입을 통해 그것을 추가했고 지금 작동합니다. – DayTripperID