我想知道一个摆动的MouseMotionEvent(或MouseReleased)结束于哪个对象。问题是MousePressed和MouseReleased事件都移到了“ press”下的对象,而不是释放源。
这是一个人为的示例,可能会更好地解释:
用户看到带有一些球和一些篮的屏幕,并被告知将球拖到篮上。每个球代表应用程序空间中的某个实体,每个篮子代表在应用程序空间中采取的某些动作。从Swing的角度来看,球和篮子是作为高度覆盖的JButton单独实现的。在mousePressed上,球将其身份存储在已知位置。我希望mouseReleased被篮子中的MouseListener捕获,该篮子会检查已知位置的球身份,然后进入程序逻辑并执行该篮子所代表的任务。
但是据我了解,Swing(实际上是AWT)的mouseReleased事件转到包含mousePressed事件的组件(即,球)。除了查看X和Y(这似乎是个残酷的丑闻)之外,我如何确定mouseReleased发生在哪个篮子中? (如果mouseRelease发生在任何篮子之外,我将需要采取某种默认的重置操作。这可以通过基础JPanel中的mouseEvent处理程序来完成)。
(请不要告诉我这是一个糟糕的界面。我所举的例子不是真实的。它以我认为易于可视化和理解的方式抽象出了我所遇到的问题。)
最佳答案
如果mouseRelease发生在任何篮子之外,我将需要采取某种默认的重置操作-
使用Drag and Drop API,然后您将只能放置支持该放置的组件。
除了查看X和Y(看起来很残酷)
为什么?该事件没有信息,因此您需要以某种方式获取它。因此,如果您不想使用DnD API,则需要自己进行操作。
API中有一些方法可以帮助您做到这一点:
Window window = SwingUtilities.windowForComponent( e.getComponent() );
Point dropPoint = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), window);
Component dropComponent = SwingUtilities.getDeepestComponentAt(window, dropPoint.x, dropPoint.y);