ScatterChart上でプロットされるデータの点はXYChart.Dataクラスで表されますが、XYChar.Dataクラスには画面上へその点を表現するためのnodeプロパティーが用意されています。これはNodeクラスの派生クラスなのでsetOnMouseClickedでマウスクリックイベントを設定できます。
たとえばチャートに表示するデータ列(XYChar.Series)を生成するときに次のようにするとマウスクリックイベントを設定できると思います。
ポイントはXYChar.Dataを作ったばかりのときはまだ画面表示用のnodeプロパティーが未設定という点です。自分でチャートの表現をカスタマイズする際には自前のNodeを生成してXYChar.Dataのnodeプロパティーへ設定してやればいいので、その際にNode#setOnMouseClickedを使ってハンドラーを登録すればいいのですが、JavaFXが自動で設定してくれるデフォルトのXYChar.Data用のNodeを使いたい場合は最初からマウスイベントのハンドラーを設定できません(いつそのNodeが追加されるかわからないので)。
そうした場合にはnodeプロパティーのChangeListenerを使って「nodeプロパティーへ実際のNodeが設定されたときにハンドラーを登録する」という戦略を用いるとよいと思います。
java
1class Foo ... {
2 ...
3 XYChart.Series<Double, Double> createSeries() {
4 Series<Double, Double> series = new Series<>();
5 series.setName("series 1");
6
7 for (int i = 0; i < 50; i++) {
8 XYChart.Data<Double, Double> p = new XYChart.Data(X座標, Y座標);
9 p.nodeProperty().addListener((ob, oldNode, newNode) -> {
10 if (newNode != null) {
11 newNode.setOnMouseClicked(this::onChartDataClicked);
12 }
13 });
14 series.getData().add(p);
15 }
16 return series;
17 }
18
19 void onChartDataClicked(MouseEvent ev) {
20 ...
21 }
22}
訂正:
上の回答に「いつそのNodeが追加されるかわからないので」と書きましたが、ご質問にあるページのサンプルを見るとstartメソッドでnodeプロパティーにtooltipをインストールするコードが書いてありますね・・・
実際にやってみるとチャートへデータ系列をsetDataするときにNodeが追加されるみたいです。自分の回答の方法でも動きはしますが、わざわざChangeListenerを使わなくてもよさそうです。
チャートへデータ列を設定した後でデータ列を走査してハンドラーを登録すればいいんですね。以下はサンプルコードの抜粋ですがtooptipのかわりにマウスクリックイベントのハンドラーを登録する例です。
//質問にあるページのサンプルコードの抜粋
scatterData.stream().forEach((series) -> {
series.getData().stream().forEach(point -> {
point.getNode().setOnClicked(this::onChartDataClicked);
});
});
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/28 10:52