【问题标题】:JFreeChart select multiple points - mouse drag - lasso - JavaJFreeChart选择多点-鼠标拖动-套索-Java
【发布时间】:2014-02-10 23:44:53
【问题描述】:

我在 Java 中使用JFreeChart 来绘制一个包含 50+ x, y 点的XYLineChart。该图表位于ChartPanel 中,它位于我的JFrame 的JPanels 之一中。

我知道JFreeChart 已经内置了缩放功能,通过鼠标单击和拖动,它会放大/缩小并显示所选“拖动”区域下的点。

我想知道如果我们在按下 CTRL、ALT 或SHIFT 键,即如果用户单击图表上的一个点然后拖动鼠标,它应该像往常一样缩放。但是如果用户在按下 SHIFT 或 ALT 或 CTRL 键的同时单击一个点并拖动,我们应该得到所有点的列表在图表 [拖动区域下方的点] 上选择。这可能吗 ?请让我知道如何去做。

我确实尝试在ChartPanel 中添加一个简单的MouseListener 来检测鼠标何时被按下和释放,但鼠标事件返回的x、y 位置值对应于点击屏幕的位置而不是到图表上各点的实际 x、y 坐标。我需要用户单击并拖动鼠标的所有点的实际坐标,以便计算在哪个点之前按下并拖动鼠标以及释放鼠标的位置,并使用该信息选择拖动下方的多个点区域。

如果有人对此有任何想法,请告诉我。

【问题讨论】:

  • 交叉发布here。
  • 很抱歉交叉发布,但我已经为这个问题苦苦挣扎了一段时间,希望有人至少向我发送他们关于如何解决这个问题的想法。
  • 我尝试在旧版本的 JFreeChart:JFreeChart 1.0.16 中实现此功能,但无法实现。我可以在我的 ChartPanel 上使用 ChartMouseListener 来获取单击某个点时的 x、y 值。但是,为了实现我想要的(选择多个点并显示它们绘制的 x、y 值),我需要在 ChartPanel 上有一个常规的 MouseListener,它可以通过使用 mousePressed() 和 mouseReleased() 来做到这一点,它使用 MouseEvent 而不是图表鼠标事件。如何使用 MouseListener 获得实际绘制的 x、y 值而不是屏幕上的 x、y 点?
  • 交叉发帖没问题;该链接让其他人知道现有的答案。

标签: swing jfreechart drag mouselistener chartpanel


【解决方案1】:

这是我在 JFreeChart 论坛上给出的答案:

在 JFreeChart 1.0.17 中没有实现,但是这个功能已经 在 JFreeChart-FSE(“未来状态版”)项目中实现 GitHub:

https://github.com/jfree/jfreechart-fse

此 repo 尚未发布,但您可以从 来源。欢迎反馈,最近没时间上班 对此,但我想从这个 repo 中完成一些发布 未来几个月的时间(我的目标是在 2014 年推出 JFreeChart 2.0)。 套索选择来自我几年前写的一些代码 现在,但来自 KNIME.org 的 Michael Zinsmaier 已经完成了大量工作 来构建这个和数据集选择状态。

【讨论】:

    【解决方案2】:

    如何使用MouseListener 获得实际绘制的 x、y 值而不是屏幕上的 x、y 点?

    添加ChartMouseListener,如图here和here。

    在JFreeChart 之外,引用here 的示例说明了使用套索进行多项选择。一个marching ants 矩形显示为here。

    【讨论】:

    • 您好,感谢您的回复。但是,我想知道如何使用常规的MouseListener 获取绘制的 x、y 值。我知道如何使用 ChartMouseListener(通过 ChartMouseEvent)来做到这一点,但它只有 2 种方法:mouseClicked() 和 mouseMoved() 而我有兴趣使用 MouseListener 的 MouseEvent 和 mousePressed() 和 mouseReleased() 方法找出鼠标从哪里开始拖到哪里。这样我就可以获得该水平范围内的所有点并检索并选择它们以创建 套索 效果。有什么办法可以做到这一点?
    • 我上面提到的有什么办法吗?由于在常规 MouseListener 中使用 ChartMouseEvent 而不是 MouseEvent 或在ChartMouseListener 中创建自定义方法,当鼠标被按下或释放时调用(如 MouseListener 的 mousePressed()、mouseReleased() 方法)都是不可能的,唯一可能的解决方案是,如果有一种方法可以在标准MouseListener 内计算实际绘制的 x、y 值(基于图表的 x、y 轴值),而不是让它根据屏幕尺寸返回 x、y]。如何做到这一点?
    • 你可以使用getTrigger()查看原始事件,建议here。
    猜你喜欢
    • 2017-12-27
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多