单击绘制的对象

时间:2012-10-17 11:47:09

标签: java swing events java-ee graphics

我有一个名为Shape的类,它继承自JPanel。

许多子类反过来扩展Shape类,每种类型一个。

每个形状都有自己的覆盖paint()方法,该方法绘制相应的形状。

我希望能够点击任何形状,我现在正试图实现这个逻辑。请注意,每个形状都已添加到arrayList中。

但是,即使我在形状内部明确单击,contains语句也总是返回false。

有什么想法吗?

2 个答案:

答案 0 :(得分:11)

永远不要覆盖paint()中的JPanel而非paintComponent(..)

我不太确定我理解但是我做了一个简短的例子,希望能有所帮助。 基本上它是一个简单的JFrame,带有DrawingPanel(我自己的类扩展JPanel并绘制形状)。此面板将创建形状(仅2个用于测试)将它们添加到ArrayList并通过JPanelpaintComponent(..)循环将它们绘制到for,它还有一个{ {1}}检查MouseAdapter上的用户mouseClicked(..) evnets。点击完成后,我们会遍历JPanel中的每个Shape并检查ArrayList是否包含该点,如果是,则打印其类名并使用Shape检查点击的instance of类型并打印相应的消息:

enter image description here

输出(点击两个形状后):

  

点击了java.awt.geom.Rectangle2D $ Double

     

点击一个矩形

     

点击了java.awt.geom.Ellipse2D $ Double

     

点击一个圆圈

<强> ShapeClicker.java:

Shape

答案 1 :(得分:3)

如果您正在实施Shape,则必须自己实施contains方法。 Shape的默认实现始终返回false

如果您的Shape受到曲线的限制,您知道如何相交(或确定某点是在一侧还是另一侧),则可以使用even-odd rule。从不受平行于直线的任何方向投射测试点的射线。如果交叉点的数量是奇数,则该点在内部。如果交叉点的数量是偶数,则该点在外面。

内置类实现此方法,因此您可以使用/扩展PolygonEllipse2D.DoubleRoundRectangle2D.Double类,并使用填充的多边形/椭圆/圆形矩形来表示它内部。