Кто-либо сделал крест нитей, который следует за мышью в JFreeChart?

Мы используем JFreeChart для создания графиков XY, и у нас есть запрос новых функций, чтобы сделать перекрестие, которое перемещается наряду с мышью и выделяет точку данных, которая наиболее тесно отображается на x-значение мыши. Вы видите подобный пример в Google Finance - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC.

Они Google строит диаграмму, только выделяют текущее значение (мы хотим сделать это и также показать крест нитей), но они показывают живое взаимодействие мыши, которое мы ищем.

У кого-либо есть какие-либо изящные предложения?

Спасибо.

6
задан David Irwin 14 December 2009 в 17:55
поделиться

3 ответа

Я получил это с помощью слушателя мыши и класса CrosshairOverlay. После того, как я вернусь из отпуска, я отправлю свой код. В итоге это оказалось не так уж и сложно.


Извините, я забыл об этом!

Во-первых, вы хотите вычислить значения x, y для того места, где вы хотите разместить перекрестие. Что касается меня, я хотел, чтобы он перемещался по точкам нашей линии, поэтому я вычислил ближайшее значение x и использовал эту пару данных для x, y.

Затем я вызываю этот метод:

protected void setCrosshairLocation(double x, Double y) {
    Crosshair domainCrosshair;
    List domainCrosshairs = crosshairOverlay.getDomainCrosshairs();
    if (domainCrosshairs.isEmpty()) {
        domainCrosshair = new Crosshair();
        domainCrosshair.setPaint(BlueStripeColors.LIGHT_GRAY_C0);
        crosshairOverlay.addDomainCrosshair(domainCrosshair);
    }
    else {
        // We only have one at a time
        domainCrosshair = (Crosshair) domainCrosshairs.get(0);
    }
    domainCrosshair.setValue(x);

    if (y != null) {
        Crosshair rangeCrosshair;
        List rangeCrosshairs = crosshairOverlay.getRangeCrosshairs();
        if (rangeCrosshairs.isEmpty()) {
            rangeCrosshair = new Crosshair();
            rangeCrosshair.setPaint(BlueStripeColors.LIGHT_GRAY_C0);
            crosshairOverlay.addRangeCrosshair(rangeCrosshair);
        }
        else {
            // We only have one at a time
            rangeCrosshair = (Crosshair) rangeCrosshairs.get(0);
        }

        rangeCrosshair.setValue(y);
    }
}

Обратите внимание, что crosshairOverlay является экземпляром из CrosshairOverlay.

4
ответ дан 17 December 2019 в 04:47
поделиться

JFreeChart не может отобразить часть диаграммы, поэтому вам нужно сделать что-то, что не требует перерисовки диаграммы. Вы можете записать свою диаграмму в BufferedImage и сохранить ее в памяти, а затем создать специальный компонент, который использует буферизованную диаграмму в качестве фонового изображения и рисует поверх нее перекрестие и другие всплывающие окна.

В JFreeChart есть методы для получения точка данных для данной координаты на визуализированной диаграмме. Не припоминаю, что это взбесилось у меня в голове. В зависимости от ваших потребностей вы можете рассмотреть возможность визуализации собственных данных диаграммы, это не так сложно, как вы думаете.

1
ответ дан 17 December 2019 в 04:47
поделиться

Первое, что приходит мне в голову, это написать собственный Курсор и установить его на вашей карте. Он может иметь ссылку на диаграмму и выделять значение x, соответствующее положению курсора x / y.

0
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: