JFreeChart-XYPlot-クリック時に値を取得し十字線を表示する-ArcXYPlotMouseClickedHandlerを使用-1


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Paint;
import java.awt.Stroke;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import jp.avaj.lib.algo.ArUtil;
import jp.avaj.lib.test.L;

/**
■ JFreeChart-XYPlot-クリック時に値を取得し十字線を表示する-ArcXYPlotMouseClickedHandlerを使用-1

・概要と注意事項.
  ・ChartPanelにMouseListenerを設定する.
  ・クリックした時に十字線を表示する.
    ・この時の対象位置は、クリック点の位置ではなく、対角線で一番近い点である.
    ・グラフからちょっと離れた部分をクリックしてみるとよい.
  ・MouseListener中でデータを取得すると前回クリックのデータが取得される.
    ・本サンプルではArXYPlotMouseClickedHandlerを使用している.
      ・上記ハンドラではスレッドを回して値を取得している.
      ・取得した値は上記ハンドラのデータ取得メソッドを呼び出して取得している.
  ・取得されたデータはdoubleなので、意味のある値(例えば日付など)に変換が必要な場合がある.
  ・値は取得できるが、グラフは取得できないので、取得された値から検索する必要がある.

 */
public class Chart19_04 {

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

  public Chart19_04() {
    // テストデータを生成する
    XYDataset dataset = createDataset();
    //
    NumberAxis yAxis = new NumberAxis();
    yAxis.setAutoRangeIncludesZero(true);
    NumberAxis xAxis = new NumberAxis();
    XYLineAndShapeRenderer xyLineAndShapeRenderer = new XYLineAndShapeRenderer();
    XYPlot xyPlot = new XYPlot(dataset,(ValueAxis)xAxis,(ValueAxis)yAxis,(XYItemRenderer)xyLineAndShapeRenderer);
    // 十字線の属性の登録
    {
      BasicStroke stroke = new BasicStroke(3.0F);
      xyPlot.setDomainCrosshairStroke((Stroke)stroke);
      xyPlot.setRangeCrosshairStroke((Stroke)stroke);
      Color color = Color.red;
      xyPlot.setDomainCrosshairPaint((Paint)color);
      xyPlot.setRangeCrosshairPaint((Paint)color);
    }
    JFreeChart jfreeChart = new JFreeChart("売上データ",(Plot)xyPlot);
    //
    ChartFrame cFrame = new ChartFrame("売上データ",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);

    // ハンドラの登録
    final ArcXYPlotMouseClickedHandler handler = new ArcXYPlotMouseClickedHandler(xyPlot);
    ChartPanel chartPanel = cFrame.getChartPanel();
    chartPanel.addMouseListener(handler);

    // ハンドラから値を取得するスレッドを起動する
    (new Thread() {
      public void run() {
        for (;;) {
          ArUtil.sleep(2000);
          ArcXYPlotMouseClickedInfo info = handler.getValue();
          if (info == null) { continue; }
          L.p("x="+info.x);
          L.p("y="+info.y);
        }
      }
    }).start();
  }

  /** テストデータを作成する */
  private static XYDataset createDataset() {
    XYSeriesCollection dataset = new XYSeriesCollection();
    // 一本目
    XYSeries xySeries = new XYSeries("data-0");
    for (int j=0; j<10; j++) {
      xySeries.add(j,j+Math.random()*4.0D);
    }
    dataset.addSeries(xySeries);
    // 二本目
    xySeries = new XYSeries("data-1");
    for (int j=0; j<10; j++) {
      xySeries.add(j,9-j+Math.random()*4.0D);
    }
    dataset.addSeries(xySeries);
    return dataset;
  }


}
/*-結果------------------------------------------------
x=8.0
y=9.712475816214415
x=8.0
y=9.712475816214415
x=8.0
y=9.712475816214415
x=1.0
y=2.4023199049842527
x=1.0
y=2.4023199049842527
-----------------------------------------------------*/

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/cc541334-7800-d223-371a-af175dca18bf.png)