JFreeChart - как мне перевести значение перекрестия домена в TimeSeriesDataItem - PullRequest
1 голос
/ 21 февраля 2012

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

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

1 Ответ

1 голос
/ 23 февраля 2012

Мне удалось со временем разобраться.Первоначально я был на правильном пути;добавьте 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());
        }

    });
...