2

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

4

4 回答 4

4

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

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

于 2010-05-14T14:47:52.863 回答
2

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

我建议在绘制几何形状的or上添加 aMouseListener和 a 。使用's回调来确定是否已单击给定形状。一旦你确定了这一点,使用's方法在鼠标光标移动时移动和重绘形状。MouseMotionListenerCanvasJPanelMouseListenermousePressed(MouseEvent)MouseMotionListenermouseDragged(MouseEvent)

于 2010-05-14T14:48:50.953 回答
1

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

于 2010-05-14T16:52:27.147 回答
0

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

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

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

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

于 2010-05-14T17:05:46.120 回答