0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

目次 ⇒ JFreeChartサンプル

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?