【问题标题】:Has anyone done crosshairs that follow the mouse in JFreeChart?有没有人在 JFreeChart 中做过跟随鼠标的十字准线?
【发布时间】:2009-12-14 17:55:17
【问题描述】:

我们正在使用 JFreeChart 制作 XY 图,并且我们有一个功能请求来做一个与鼠标一起移动的十字准线,并突出显示最接近映射到鼠标 x 值的数据点。您可以在 Google 财经 - http://www.google.com/finance?q=INDEXDJX:.DJI,INDEXSP:.INX,INDEXNASDAQ:.IXIC 上看到类似的示例。

那些 Google 图表仅突出显示当前值(我们希望这样做并且还显示十字准线),但它们显示了我们正在寻找的实时鼠标交互。

有人有什么优雅的建议吗?

谢谢。

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    我使用鼠标侦听器和 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 的一个实例。

    【讨论】:

      【解决方案2】:

      JFreeChart 无法呈现图表的子部分,因此您需要做一些不需要重新绘制图表的事情。您可以将图表写入 BufferedImage 并将其存储在内存中,然后有一个自定义组件使用缓冲图表作为背景图像,并在其上绘制十字准线和其他弹出窗口。

      JFreeChart 中有一些方法可以获取渲染图表上给定坐标的数据点。不记得这些在我脑海中是什么。根据您的需要,您可以考虑渲染自己的图表数据,这并不像您想象的那么难。

      【讨论】:

        【解决方案3】:

        我首先想到的是编写一个自定义Cursor 并将其设置在您的图表上。它可以对图表有一个引用,并突出显示与光标的 x/y 位置一致的 x 值。

        【讨论】:

          【解决方案4】:

          这对我有用。我设置了

          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();
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-10
          相关资源
          最近更新 更多