2017-04-25 63 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

相关问题