我有一个 JPanel,它有一条线、一个圆等。现在,当我点击这条线时,该事件会被报告为线事件还是一般 JFrame 事件。如果用户单击该线并移动它,我需要能够移动该线。这在 Java2D 中可能吗?
4 回答
是的,但您需要做一些工作(参见 java.awt.Shape)。基本上,您需要跟踪形状列表。JPanel 将收到一个鼠标事件,您可以将其转换为 (x,y) 坐标。然后您可以调用 Shape.contains(x,y) 来查看您的各种形状是否被点击。
这适用于圆形、多边形、弧形等;但是在 Line2D 的情况下,它不会那么容易工作,但是您可以使用 Line2D.intersects() 在鼠标单击周围有一个小矩形(这也是很好的 UI,因为您不想强迫用户单击正好在一个很难看到的像素上)。
除非您决定实施一个,否则没有“线事件”这样的概念。
我建议在绘制几何形状的or上添加 aMouseListener
和 a 。使用's回调来确定是否已单击给定形状。一旦你确定了这一点,使用's方法在鼠标光标移动时移动和重绘形状。MouseMotionListener
Canvas
JPanel
MouseListener
mousePressed(MouseEvent)
MouseMotionListener
mouseDragged(MouseEvent)
这是一个简单的示例,演示了其他答案中引用的一些技术。
几年前我在 Java 中创建了一个画布标记库,如果您不需要担心画布上的变换(缩放、旋转等),这很容易做到。
基本上,您只需要在 List 中维护画布形状的集合(而不是 Set,因为 Z 顺序可能很重要)。鼠标侦听器将在您的画布上,而不是在单个形状上。将新项目添加到集合的开头(或稍后向后迭代列表)。
当画布接收到鼠标按下事件时,遍历您的形状集合,直到找到位于鼠标坐标下方的形状。最简单的方法是让你的形状实现一个定义某种 hitPoint(int x, int y) 方法的接口。这样,您的矩形可以实现 contains(),线条可以执行 intersects() 或图形路径,您可以考虑一些命中填充等。
更进一步,您的形状应该定义自己的 draw(Graphics2D g) 方法,以便您可以轻松地执行选择框之类的操作,或者将绘制模式设置为 XOR 以使形状“移动”更容易。画布的paintComponent 方法只需遍历形状集合,对每个形状调用shape.draw(g),将提供给paintComponent 方法的图形实例传递给您。