2017-04-25 62 views
0

我有一個JavaFx自定義條形圖,標籤顯示在FXCanvas上用於SWT RCP應用程序。感謝答案張貼How to clear text added in a javafx barchart?JavaFx自定義條形圖鼠標事件不會觸發

然而,當我加入鼠標事件偵聽器,條形圖的節點,是沒有得到檢測到鼠標事件

private void addMouseListener(XYChart.Series<String, Number> series) { 
      for (XYChart.Data<String, Number> xyData : series.getData()) { 
       if (xyData != null && xyData.getNode() != null) { 
        final Node node = xyData.getNode(); 
        node.setOnMousePressed((MouseEvent event) -> { 
         System.out.println("you clicked " + xyData.toString()); 

       } 
      } 
     } 

調用addMouseListener將內部createBarChart下面行代碼

BarChartExt barChart = new BarChartExt<String, Number>(xAxis, yAxis); 
    barChart.setTitle("Summary"); 

    Scene scene = new Scene(barChart, 300, 300); 
    barChart.getData().add(series); 
    addMouseListener(series) 
    scene.getStylesheets().add("css/barchart.css"); 
    canvas.setScene(scene); 

如果我將Custom BarChart更改爲javafx.chart.BarChart類,則會識別事件。只有自定義BarChart鼠標事件不會觸發。

欣賞有沒有人能幫助我處理這個用例。 TIA

回答

1

自定義條形圖使用TextFlow創建了系列數據。以下是摘錄

@Override 
    protected void seriesAdded(Series<X, Y> series, int seriesIndex) { 

     super.seriesAdded(series, seriesIndex); 

     for (int j = 0; j < series.getData().size(); j++) { 

      Data<X, Y> item = series.getData().get(j); 
      Text text = new Text(String.valueOf(item.getYValue());); 
      text.setStyle("-fx-font-size: 10pt;"); 

      TextFlow textFlow = new TextFlow(text); 
      textFlow.setTextAlignment(TextAlignment.CENTER); 

      nodeMap.put(item.getNode(), textFlow); 
      getPlotChildren().add(textFlow); 

      textFlow.setOnMousePressed((MouseEvent event) -> { 
       System.out.println("custom bar chart you clicked " + item); 
      }); 
     } 
    } 

由於系列數據節點被TextFlow覆蓋。我不得不將偵聽器添加到TextFlow而不是Node。以下是自定義條形圖的屏幕截圖。

enter image description here

相關問題