Java 使用鼠标平移图表-Jfreechart

Java 使用鼠标平移图表-Jfreechart,java,jfreechart,Java,Jfreechart,我们可以在JfreeChart中将平移功能实现为鼠标拖动事件吗?现在我按CTRL键并拖动鼠标来平移图表。我想通过拖动鼠标来实现平移功能。这可能吗?显然不可能使用当前的JFreeChart API更改修改器键,正如前面所讨论的(但它正在准备中) 但是,可以通过编程方式平移图表,因此您可以尝试以下操作: 将一个MouseMotionListener添加到ChartPanel以跟踪mouseDragged()事件 根据这些事件,计算图表的请求移动 直接调用XYPlot.panDomainAxes()

我们可以在JfreeChart中将平移功能实现为鼠标拖动事件吗?现在我按CTRL键并拖动鼠标来平移图表。我想通过拖动鼠标来实现平移功能。这可能吗?

显然不可能使用当前的JFreeChart API更改修改器键,正如前面所讨论的(但它正在准备中)

但是,可以通过编程方式平移图表,因此您可以尝试以下操作:

  • 将一个
    MouseMotionListener
    添加到
    ChartPanel
    以跟踪
    mouseDragged()
    事件
  • 根据这些事件,计算图表的请求移动
  • 直接调用
    XYPlot.panDomainAxes()
    XYPlot.panRangeAxis()
    (API)
图表面板
中汲取灵感:

这是我的解决办法

问候 助教


解决方案仍然没有提供新版本,所以我把它完美地为我工作,它也自动变焦范围轴时,你滚动:

    ChartPanel panel = new ChartPanel(chart);
    panel.setMouseZoomable(false);
    panel.setMouseWheelEnabled(true);
    panel.setDomainZoomable(true);
    panel.setRangeZoomable(false);
    panel.setPreferredSize(new Dimension(1680, 1100));
    panel.setZoomTriggerDistance(Integer.MAX_VALUE);
    panel.setFillZoomRectangle(false);
    panel.setZoomOutlinePaint(new Color(0f, 0f, 0f, 0f));
    panel.setZoomAroundAnchor(true);
    try {
        Field mask = ChartPanel.class.getDeclaredField("panMask");
        mask.setAccessible(true);
        mask.set(panel, 0);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    panel.addMouseWheelListener(arg0 -> panel.restoreAutoRangeBounds());

现在,JFreeChart的行为与任何其他专业绘图软件一样

在回答堆栈溢出问题时,最好解释一下代码的作用。因为只有代码才能回答问题的OP可能无法理解
Field mask = ChartPanel.class.getDeclaredField("panMask");
mask.setAccessible(true);
mask.set(yourChartPanel, Integer.valueOf(0)); // The "0" mask is equivalent to no mask. You could also set a different modifier.
 ChartPanel cp = new ChartPanel(chart)
  {
     /**
      * A hack to change the zoom and panning function.
      * With this override we can pan around by dragging.
      * If SHIFT is pressed we get the zoom rectangle.
      * @param e
      */
     @Override
     public void mousePressed(MouseEvent e)
     {
        int mods = e.getModifiers();

        int panMask = MouseEvent.BUTTON1_MASK;

        if (mods == MouseEvent.BUTTON1_MASK+MouseEvent.SHIFT_MASK)
        {
           panMask = 255; //The pan test will match nothing and the zoom rectangle will be activated.
        }

        try
        {
           Field mask = ChartPanel.class.getDeclaredField("panMask");
           mask.setAccessible(true);
           mask.set(this, panMask);

        }
        catch (Exception ex)
        {
           ex.printStackTrace();
        }

        super.mousePressed(e);
     }
  };
    ChartPanel panel = new ChartPanel(chart);
    panel.setMouseZoomable(false);
    panel.setMouseWheelEnabled(true);
    panel.setDomainZoomable(true);
    panel.setRangeZoomable(false);
    panel.setPreferredSize(new Dimension(1680, 1100));
    panel.setZoomTriggerDistance(Integer.MAX_VALUE);
    panel.setFillZoomRectangle(false);
    panel.setZoomOutlinePaint(new Color(0f, 0f, 0f, 0f));
    panel.setZoomAroundAnchor(true);
    try {
        Field mask = ChartPanel.class.getDeclaredField("panMask");
        mask.setAccessible(true);
        mask.set(panel, 0);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    panel.addMouseWheelListener(arg0 -> panel.restoreAutoRangeBounds());