JavaFX:在折线图的节点上设置 ClickListener

JavaFX: set ClickListener on nodes of a LineChart

我有一个 JavaFX 应用程序,它首先计算一些数据,然后将数据点添加到折线图上。我想在节点上添加一个 ClickListener,如果用户点击图表上的任何节点,相应的值将出现在 TableView 或其他东西中。但是我无法检索节点的值。

代码如下:

lineChart.getData().add(series);
series.getNode().setOnMouseClicked(nodeClicked);

EventListener 的代码:

EventHandler<MouseEvent> nodeClicked = new EventHandler<MouseEvent>(){

        @Override
        public void handle(MouseEvent event) {
            System.out.println("clicked");
        }
};

我也试过在LineChart上设置Listener,但是在事件对象中找不到相应的节点信息,比如value等

提前致谢,此致

您似乎正在将处理程序添加到与数据 系列 关联的节点。折线图中的这个节点就是折线本身,因此您应该在单击折线时看到控制台输出。

要让侦听器响应对数据点本身的点击,您需要将侦听器添加到与各个 XYChart.Data 实例关联的节点。

请注意,这些节点仅在数据添加到系列系列添加到图表后才创建;所以你必须小心,只在这些事件发生后才添加事件处理程序。

这是一个 SSCCE:

import java.util.Random;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.stage.Stage;

public class LineChartWithEventHandlers extends Application {

    @Override
    public void start(Stage primaryStage) {

        LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis());
        Series<Number, Number> series = new Series<>();
        series.setName("Data");

        chart.getData().add(series);

        // handler for clicking on line:
        series.getNode().setOnMouseClicked(e -> System.out.println("Click on series"));

        Random rng = new Random();
        for (int x = 0 ; x <= 20 ; x++) {
            Data<Number, Number> data = new Data<>(x, rng.nextInt(100));
            series.getData().add(data);

            // handler for clicking on data point:
            data.getNode().setOnMouseClicked(e -> 
                System.out.printf("Click on data [%d, %d]%n", data.getXValue(), data.getYValue()));
        }

        Scene scene = new Scene(chart);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

点击线后的屏幕截图,两个不同的数据点,再次点击线: