当前位置: 首页 > 知识库问答 >
问题:

JavaFX:在LineChart的节点上设置ClickListener

薛焱
2023-03-14

我有一个JavaFX应用程序,它首先计算一些数据,然后在LineChart上添加datapoints。我想在节点上添加一个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上设置监听器,但在事件-对象中找不到相应的节点信息,如value等。

共有1个答案

卞成荫
2023-03-14

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

要让侦听器响应对数据点本身的单击,您需要将侦听器添加到与各个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);
    }
}

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

 类似资料:
  • 我已经用FXML创建了一个布局,它由一个带有sideMenu的BorderPane和一个用于其他内容的innerBorderPane组成... 但是,由于我刚刚开始使用JavaFX中的FXML,所以我只需要知道如何做下一件事... custom.FXML(这是主要的FXML布局) sideMenu.FXML(这是sideMenu FXML布局) java(这是sideMenu JavaFX控制器)

  • 所以我要做的是,我要编写一个GUI来在LineChart上显示实时数据。到目前为止,我可以让linechart工作,但不能进入GUI。 使用scenebuilder,我制作了一个带有linechart对象的视图,以便将其链接到我生成的图表。但由于某些原因,这似乎不能与我的MainApp中的代码一起工作。 这只显示了带有空线程的视图。我知道图表应该知道然而,因为我可以使用它来创建一个场景,并显示到G

  • 问题内容: 我尝试在Google Container Engine的群集节点上安装ElasticSearch(最新版本),但是ElasticSearch需要变量:>> 262144。 如果我ssh到每个节点并手动运行: 一切正常,但是任何新节点将没有指定的配置。 所以我的问题是: 有没有办法在引导时在每个节点上加载系统配置?Deamon Set并不是一个好的解决方案,因为在Docker容器中,系统

  • 私有静态无效printChartAnalysis(analysisResults r){

  • 我试图用一些随机信息创建一个简单的LineChart,但当我试图通过SceneBuilder使用fxml文件创建时,图表显示了但从未填充。每当我手动创建vbox、linechart和scene时,一切工作都很好。我真的很困惑,在使用fxml文件时,图表代码应该去哪里。

  • 在JavaFx中,我有一个LineChart, 它显示得很好,但似乎可以对所有数据点进行采样,以便将整个域放入图表中。 是否有一种方法可以强制LineChart只显示系列的最后10个数据点? 最后,我想创建一种方法来平移图表内容,以便显示一个窗口的数据,作为平移位置的函数。 我找到了这个SO post但是它删除了数据,这意味着我需要将它添加回来。我宁愿在可能的情况下将所有数据保留在系列中,并在可能