JFreeChart - 如何将域十字准线值转换为TimeSeriesDataItem

时间:2012-02-20 23:22:16

标签: jfreechart

我有一个XYPlot在TimeSeriesCollection中显示多个TimeSeries。我希望能够获得对应于域十字准线点击的TimeSeriesDataItem列表。

看起来我可以添加一个PlotChangeListener来通知十字线值的变化然后我可以调用XYPlot.getDomainCrosshairValue(),但是我看不到如何使用该十字准线值来获得正确的时间系列物品

1 个答案:

答案 0 :(得分:1)

我最终设法弄明白了。我最初是在正确的轨道上;添加一个PlotChangeListener以通知更改,然后获取十字准线值。因为我的域轴是DateAxis,所以作为十字准线值返回的值实际上是十字准线所在的日期的毫秒值。从那里,我可以构造一个Day实例,可用于从我的TimeSeriesCollection中的每个TimeSeries中检索TimeSeriesDataItem。

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

        }
    }

});

然后,您还必须将MouseClickListener添加到ChartPanel,以便您可以将点击委托给图表。否则,你的情节改变监听器永远不会被调用。

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());
        }

    });