我有一个名为Shape
的类,它继承自JPanel。
许多子类反过来扩展Shape
类,每种类型一个。
每个形状都有自己的覆盖paint()
方法,该方法绘制相应的形状。
我希望能够点击任何形状,我现在正试图实现这个逻辑。请注意,每个形状都已添加到arrayList中。
但是,即使我在形状内部明确单击,contains语句也总是返回false。
有什么想法吗?
答案 0 :(得分:11)
永远不要覆盖paint()
中的JPanel
而非paintComponent(..)
我不太确定我理解但是我做了一个简短的例子,希望能有所帮助。
基本上它是一个简单的JFrame
,带有DrawingPanel
(我自己的类扩展JPanel
并绘制形状)。此面板将创建形状(仅2个用于测试)将它们添加到ArrayList
并通过JPanel
和paintComponent(..)
循环将它们绘制到for
,它还有一个{ {1}}检查MouseAdapter
上的用户mouseClicked(..)
evnets。点击完成后,我们会遍历JPanel
中的每个Shape
并检查ArrayList
是否包含该点,如果是,则打印其类名并使用Shape
检查点击的instance of
类型并打印相应的消息:
输出(点击两个形状后):
点击了java.awt.geom.Rectangle2D $ Double
点击一个矩形
点击了java.awt.geom.Ellipse2D $ Double
点击一个圆圈
<强> ShapeClicker.java:强>
Shape
答案 1 :(得分:3)
如果您正在实施Shape
,则必须自己实施contains
方法。 Shape
的默认实现始终返回false
。
如果您的Shape
受到曲线的限制,您知道如何相交(或确定某点是在一侧还是另一侧),则可以使用even-odd rule。从不受平行于直线的任何方向投射测试点的射线。如果交叉点的数量是奇数,则该点在内部。如果交叉点的数量是偶数,则该点在外面。
内置类实现此方法,因此您可以使用/扩展Polygon
,Ellipse2D.Double
或RoundRectangle2D.Double
类,并使用填充的多边形/椭圆/圆形矩形来表示它内部。