Мы используем JFreeChart для создания графиков XY, и у нас есть запрос новых функций, чтобы сделать перекрестие, которое перемещается наряду с мышью и выделяет точку данных, которая наиболее тесно отображается на x-значение мыши. Вы видите подобный пример в Google Finance - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC.
Они Google строит диаграмму, только выделяют текущее значение (мы хотим сделать это и также показать крест нитей), но они показывают живое взаимодействие мыши, которое мы ищем.
У кого-либо есть какие-либо изящные предложения?
Спасибо.
Я получил это с помощью слушателя мыши и класса 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.
JFreeChart не может отобразить часть диаграммы, поэтому вам нужно сделать что-то, что не требует перерисовки диаграммы. Вы можете записать свою диаграмму в BufferedImage и сохранить ее в памяти, а затем создать специальный компонент, который использует буферизованную диаграмму в качестве фонового изображения и рисует поверх нее перекрестие и другие всплывающие окна.
В JFreeChart есть методы для получения точка данных для данной координаты на визуализированной диаграмме. Не припоминаю, что это взбесилось у меня в голове. В зависимости от ваших потребностей вы можете рассмотреть возможность визуализации собственных данных диаграммы, это не так сложно, как вы думаете.
Первое, что приходит мне в голову, это написать собственный Курсор и установить его на вашей карте. Он может иметь ссылку на диаграмму и выделять значение x, соответствующее положению курсора x / y.