我在JAVA中有一个图形应用程序,它由许多不同的形状(线条,圆形,弧形等组成,通过Graphics.drawLine(),drawArc()...方法绘制)。我想在许多(如果不是全部)绘制的对象上创建鼠标悬停事件。
我的想法是在其中存储某种带有元数据的位图,并使用它来确定鼠标所在的对象。有没有办法在Java中这样做? (循环遍历每个鼠标移动的所有对象似乎不可行)。
谢谢,
约翰
答案 0 :(得分:1)
这取决于您的规格。你没有提到这些形状是否允许重叠,移动,有多少可以存在等等。
解决方案a)最简单的方法是将每个形状实现为JComponent
描述(例如JPanel
)。所以你会有一个CirclePanel,一个扩展JPanel
的ArcPanel等,每一个都以与现在相同的方式进行自我绘制。
将形状作为JComponent,您可以向每个面板添加MouseListener
,然后处理mouseEntered()
,mouseExited()
事件。
解决方案b)另一方面,如果您需要在单个组件的区域上绘制所有形状(我现在理解的情况),那么您仍然不需要迭代所有形状形状。您只需要引入一种算法,根据它们的位置对形状进行分类,以便能够在“isMouseOver(Shape s)
”测试程序中快速排除它们。
例如,假设您将区域划分为左右两个相等的子区域(让我们称之为区块)。创建每个形状时,您可以测试它们与哪个图块相交,并将此信息存储在形状和相应图块中。
现在,当您需要测试鼠标是否在形状上时,您可以决定鼠标在哪个图块上。这样,您只需检查与左侧或右侧平铺相交的形状。假设你的形状在屏幕上均匀分布,你只需要通过一次测试就拒绝了50%的形状。
根据您拥有的形状数量,您可以使用4或8个图块,或者您甚至可以动态创建/删除图块(例如,根据屏幕的一个区域中是否有多少对象聚集在一起)。
我建议尝试第一种解决方案,因为它更简单,更清洁。如果您认为它不符合您的需求,那么您可以采用与第二种类似的方法。
答案 1 :(得分:1)
(从评论中移出)
优点:
缺点: