JavaFx自定义条形图鼠标事件未触发

时间:2017-04-25 23:25:40

标签: java javafx charts swt bar-chart

我有一个JavaFx自定义条形图,其标签显示在FXCanvas上,用于SWT RCP应用程序。感谢发布How to clear text added in a javafx barchart?

的答案

但是,当我将鼠标事件监听器添加到条形图的节点时,未检测到鼠标事件

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());

                }
            }
        }

使用下面的代码行

在createBarChart中调用addMouseListener
    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 个答案:

答案 0 :(得分: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