2012-02-20 15 views
1

私は、TimeSeriesCollectionに複数のTimeSeriesを表示するXYPlotを持っています。私は、ドメインの十字線のクリックに対応するTimeSeriesDataItemsのリストを取得できるようにしたいと思います。JFreeChart - ドメインの十字線の値をTimeSeriesDataItemに変換するには

十字線の値の変更を通知するためにPlotChangeListenerを追加することができ、XYPlot.getDomainCrosshairValue()を呼び出すことができますが、その十字線の値を使用して右を取得する方法がわかりません時系列のアイテム

答えて

1

私は最終的にそれを把握することができました。私はもともと正しい道のりでした。 PlotChangeListenerを追加して変更を通知し、十字線の値を取得します。私のドメイン軸がDateAxisなので、十字線の値として返される値は実際に十字線が当たる日付のミリ秒の値です。それから、TimeSeriesCollection内の各TimeSeriesからTimeSeriesDataItemを取得するために使用できるDayインスタンスを作成できます。

plot.addChangeListener(new PlotChangeListener() { 

    public void plotChanged(PlotChangeEvent event) { 
     double crosshairXValue = this.plot.getDomainCrosshairValue(); 

     if (crosshairXValue == 0) { 
      return; 
     } 

     Date date = new Date((long) crosshairXValue); 
     Day day = new Day(date); 

     for (Iterator<TimeSeries> itr = timeseriesCollection.getSeries().iterator(); itr.hasNext();) { 

      TimeSeries timeSeries = itr.next(); 
      TimeSeriesDataItem dataItem = timeSeries.getDataItem(day); 

      Number balance = dataItem.getValue(); 

      System.out.println("Balance for day " + day + " is " + balance); 
      //TODO publish balances to listeners 

     } 
    } 

}); 

さらに、グラフにクリックを委任できるように、ChartPanelにMouseClickListenerを追加する必要があります。そうしないと、プロット変更リスナーが呼び出されません。

chartPanel.addChartMouseListener(new ChartMouseListener() { 

     public void chartMouseMoved(ChartMouseEvent event) { 
      // Do nothing 
     } 

     public void chartMouseClicked(ChartMouseEvent event) { 
      int x = event.getTrigger().getX(); 
      int y = event.getTrigger().getY(); 
      chart.handleClick(x, y, chartPanel.getChartRenderingInfo()); 
     } 

    }); 
関連する問題