代码之家  ›  专栏  ›  技术社区  ›  Boolean

Java2D:捕捉Line对象上的事件

  •  2
  • Boolean  · 技术社区  · 14 年前

    我有一个JPanel,它有一条线,一个圆,等等。现在当我点击这条线时,这个事件会被报告为一个线事件还是一个普通的JFrame事件。我需要能够移动线,如果用户点击线和移动它。这在Java2D中可能吗?

    4 回复  |  直到 12 年前
        1
  •  4
  •   Justin    14 年前

    是的,但是您需要做一些工作(参见java.awt.Shape)。基本上你需要跟踪一个形状列表。JPanel将接收一个鼠标事件,您可以将其转换为(x,y)坐标。然后可以调用Shape.contains(x,y)来查看是否单击了各种形状。

    这将适用于圆、多边形、圆弧等;但是,对于Line2D来说,它不会那么容易工作,但是您可以使用Line2D.intersects(),在鼠标单击周围有一个小矩形(这也是一个很好的UI,因为您不想强制用户精确地单击一个难以看到的像素)。

        2
  •  2
  •   Adamski    14 年前

    没有“行事件”这样的概念,除非您决定实现一个。

    我建议加一个 MouseListener 和一个 MouseMotionListener Canvas JPanel 你的几何图形被画在上面。使用 鼠标听筒 mousePressed(MouseEvent) 鼠标移动 mouseDragged(MouseEvent) 方法在移动鼠标光标时移动和重新绘制形状。

        3
  •  1
  •   trashgod    14 年前

    这里有一个简单的例子 example 这说明了其他答案中引用的一些技巧。

        4
  •  0
  •   Jeff    14 年前

    当画布接收到鼠标按下事件时,遍历形状集合,直到找到位于鼠标坐标下的形状。最简单的方法是让您的形状实现一个接口,该接口定义某种hitPoint(intx,inty)方法。这样你的矩形就可以实现contains(),直线可以实现intersects()或者图形路径,你可以考虑一些填充,等等。

    更进一步,您的形状应该定义自己的绘制(graphics2dg)方法,以便您可以轻松地执行选择框之类的操作,或者将绘制模式设置为“异或”以使形状更容易“移动”。画布的paintComponent方法只需遍历图形集合,对每个图形调用shape.draw(g),并将提供给paintComponent方法的图形实例传递给它。