JFreeChart — как преобразовать значение перекрестия домена в TimeSeriesDataItem

У меня есть XYPlot, отображающий несколько TimeSeries в TimeSeriesCollection. Я хотел бы иметь возможность получить список TimeSeriesDataItems, которые соответствуют щелчку перекрестия домена.

Похоже, я могу добавить PlotChangeListener для уведомления об изменении значения перекрестия, а затем я могу вызвать XYPlot.getDomainCrosshairValue(), но я не вижу, как затем использовать это значение перекрестия для получения правильных элементов временного ряда.


person KevinS    schedule 20.02.2012    source источник


Ответы (1)


В конце концов мне удалось это выяснить. Изначально я был на правильном пути; добавьте PlotChangeListener, чтобы получать уведомления об изменении, а затем получить значение перекрестия. Поскольку моя ось домена представляет собой DateAxis, значение, возвращаемое в качестве значения перекрестия, на самом деле является миллисекундным значением даты, на которую падает перекрестие. Исходя из этого, я могу создать экземпляр Day, который можно использовать для извлечения TimeSeriesDataItem из каждой серии TimeSeries в моей коллекции TimeSeriesCollection.

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

    });
person KevinS    schedule 22.02.2012