Java2D:捕获Line对象上的事件

时间:2010-05-14 14:41:22

标签: java graphics java-2d

我有一个JPanel,它有一个直线,圆圈等。现在,当我点击该行时,该事件将被报告为行事件或一般JFrame事件。如果用户点击该行并移动它,我需要能够移动该行。这在Java2D中是否可行?

4 个答案:

答案 0 :(得分:4)

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

这适用于Circle,Polygon,Arc等;但是在Line2D的情况下,它不会那么容易,但你可以使用Line2D.intersects()在鼠标点击周围有一个小矩形(这也是很好的UI,因为你不想强迫用户点击完全在一个很难看到的像素上。

答案 1 :(得分:2)

除非你决定实施一个“线事件”,否则没有这样的概念。

我建议将MouseListenerMouseMotionListener添加到您绘制几何形状的CanvasJPanel。使用MouseListener的{​​{1}}回调确定是否已点击指定的形状。确定后,使用mousePressed(MouseEvent)的{​​{1}}方法移动鼠标光标并重新绘制形状。

答案 2 :(得分:1)

这是一个简单的example,演示了其他答案中引用的一些技巧。

答案 3 :(得分:0)

几年前我用Java创建了一个画布标记库,如果你不需要担心画布上的变换(缩放,旋转等),那么很容易做到。

基本上你只需要在List中维护一个画布形状的集合(不是一个Set,因为Z顺序可能很重要)。鼠标监听器将在您的画布上,而不是在单个形状上。将新项添加到集合的开头(或稍后向后迭代列表)。

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

更进一步,你的形状应该定义他们自己的绘图(Graphics2D g)方法,这样你就可以轻松地做选择框之类的事情,或者将绘画模式设置为XOR以使形状“移动”更容易。画布的paintComponent方法只需遍历您的形状集合,在每个形状上调用shape.draw(g),传递提供给paintComponent方法的图形实例。