Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有人在JFreeChart中做过跟踪鼠标的十字瞄准吗?_Java_Jfreechart - Fatal编程技术网

Java 有人在JFreeChart中做过跟踪鼠标的十字瞄准吗?

Java 有人在JFreeChart中做过跟踪鼠标的十字瞄准吗?,java,jfreechart,Java,Jfreechart,我们正在使用JFreeChart绘制XY图,并且我们有一个功能请求来制作十字线,该十字线随鼠标移动,并高亮显示最接近鼠标x值的数据点。你可以在谷歌金融看到一个类似的例子 这些谷歌图表只突出显示当前值(我们希望这样做,并显示十字光标),但它们显示了我们正在寻找的实时鼠标交互 有人有什么优雅的建议吗 谢谢。我想到的第一件事是写一个自定义项并将其设置在图表上。它可以引用图表并突出显示与光标x/y位置一致的x值。JFreeChart无法呈现图表的子部分,因此您需要执行一些不需要重新绘制图表的操作。您可以

我们正在使用JFreeChart绘制XY图,并且我们有一个功能请求来制作十字线,该十字线随鼠标移动,并高亮显示最接近鼠标x值的数据点。你可以在谷歌金融看到一个类似的例子

这些谷歌图表只突出显示当前值(我们希望这样做,并显示十字光标),但它们显示了我们正在寻找的实时鼠标交互

有人有什么优雅的建议吗


谢谢。

我想到的第一件事是写一个自定义项并将其设置在图表上。它可以引用图表并突出显示与光标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()