Java 有人在JFreeChart中做过跟踪鼠标的十字瞄准吗?
我们正在使用JFreeChart绘制XY图,并且我们有一个功能请求来制作十字线,该十字线随鼠标移动,并高亮显示最接近鼠标x值的数据点。你可以在谷歌金融看到一个类似的例子 这些谷歌图表只突出显示当前值(我们希望这样做,并显示十字光标),但它们显示了我们正在寻找的实时鼠标交互 有人有什么优雅的建议吗Java 有人在JFreeChart中做过跟踪鼠标的十字瞄准吗?,java,jfreechart,Java,Jfreechart,我们正在使用JFreeChart绘制XY图,并且我们有一个功能请求来制作十字线,该十字线随鼠标移动,并高亮显示最接近鼠标x值的数据点。你可以在谷歌金融看到一个类似的例子 这些谷歌图表只突出显示当前值(我们希望这样做,并显示十字光标),但它们显示了我们正在寻找的实时鼠标交互 有人有什么优雅的建议吗 谢谢。我想到的第一件事是写一个自定义项并将其设置在图表上。它可以引用图表并突出显示与光标x/y位置一致的x值。JFreeChart无法呈现图表的子部分,因此您需要执行一些不需要重新绘制图表的操作。您可以
谢谢。我想到的第一件事是写一个自定义项并将其设置在图表上。它可以引用图表并突出显示与光标x/y位置一致的x值。JFreeChart无法呈现图表的子部分,因此您需要执行一些不需要重新绘制图表的操作。您可以将图表写入缓冲区图像并将其存储在内存中,然后使用自定义组件将缓冲后的图表用作背景图像,并在其上绘制十字光标和其他弹出窗口
JFreeChart中有一些方法可以获取渲染图表上给定坐标的数据点。我想不起来这些是什么。根据您的需要,您可能会考虑呈现自己的图表数据,这并不像您所想的那么难。 < P>我使用鼠标侦听器和StxSyrRaveLayle类进行了这项工作。假期旅行回来后,我会发布我的代码。结果并不太难
对不起,我忘了 首先,要计算十字准线所在位置的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的一个实例。这对我很有用。我设定了
chartPanel.addChartMouseListener(new ChartMouseListener() {
public void chartMouseMoved(ChartMouseEvent event)
{
try
{
double[] values = getCrossHairValue(event);
plot.clearRangeMarkers();
plot.clearDomainMarkers();
Marker yMarker = new ValueMarker(values[1]);
yMarker.setPaint(Color.darkGray);
plot.addRangeMarker(yMarker);
Marker xMarker = new ValueMarker(values[0]);
xMarker.setPaint(Color.darkGray);
plot.addDomainMarker(xMarker);
chartPanel.repaint();
} catch (Exception e)
{
}
}
}getCrossHairValue方法如何?它来自哪里?我想它只返回:
int mouseX=event.getTrigger().getX();int mouseY=event.getTrigger().getY()代码>