2012-02-09 48 views
1

我有几个Graphics2D对象(Line2D,Rectangle2D,Ellipse2D,Rectangle2D)和一个GeneralPath。我知道如果我想对它们进行测试,我可以使用.contains(Point)方法,但是当它们没有被填充时我需要对这些对象进行测试。所以我只想测试用户是否点击了它们边缘。现在我不必担心边界的厚度。假设我只需要担心用户是否在边界/线条的10个像素内单击。在Graphics2D对象上点击测试?

我确实有一个MouseListener,我可以获取鼠标单击的坐标,而我的Graphics2D对象存储在我迭代的数据结构中。我只是不知道如何在线条/边框上进行测试。

任何建议将不胜感激!

回答

2

我从来没有理由使用它,但它看起来像你最好的选择是Graphics2D.hit()方法here

只需在鼠标位置使用1px * 1px的矩形,并将onStroke参数设置为true,并确保在执行操作之前正确设置了Clip,Transform和Stroke属性(如javadoc中所述)电话。

+0

如果我不关心中风,但是距边界/中风的特定距离(例如10px)就好像1px宽? 例如,如果Ellipse2D的笔画是20px,但我只需要知道用户是否仅在10px内单击了? – Eric 2012-02-09 18:54:12

+0

我结束了调用Graphics2D.setStroke(10),它完美的工作! 感谢Baqueta&Ben – Eric 2012-02-09 23:31:21

1

这里就是我想要做的:

Ellipse2D的情况: 你想看看你的鼠标已经触及Ellipse2D的边缘,创造一个Ellipse2D的比原来的稍大,和Ellipse2D的每一次这是稍微小一点。如果您的鼠标点击点位于较大的Ellipse2D内部,但位于较小的点之外,则您已单击“关闭”至原始形状的边缘。

Rectangle2D案例: 解决这个问题的方式与您做Ellipse2D的方式相同 - 让一个更大,一个更小,然后确定您的鼠标是否位于较大的位置,但位于较小的位置之外。

Line2D案例: 创建一个Rectangle2D,将Line2D包围一定的宽度。然后看看你的鼠标是否在Rectangle2D中。

+0

我认为Baqueta的解决方案基本上是做同样的事情,但比这更优雅。我没有意识到G2d.hit()方法 - 这很酷:) – CodeBlind 2012-02-09 18:11:20

+0

由于我奇怪的需求,你的建议可能会更好,我必须试一试:) – Eric 2012-02-09 18:59:22