繁体   English   中英

Java2D:在Line对象上捕获事件

[英]Java2D: Capturing an event on a Line object

我有一个具有线,圆等的JPanel。现在,当我单击该线时,该事件将被报告为线事件还是一般的JFrame事件。 如果用户单击该行并将其移动,则我需要能够移动该行。 Java2D中可能吗?

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

这将对圆形,多边形,弧形等有效; 但是,对于Line2D来说,它工作起来并不容易,但是您可以在鼠标单击周围使用带有一个小矩形的Line2D.intersects()(这也是很好的UI,因为您不想强迫用户单击恰好在难以看到的像素上)。

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

我建议将MouseListenerMouseMotionListener添加到在其上绘制几何形状的CanvasJPanel中。 使用MouseListenermousePressed(MouseEvent)回调确定是否已单击给定形状。 建立此方法后,请使用MouseMotionListenermouseDragged(MouseEvent)方法移动并在移动鼠标光标时重新绘制形状。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM