Swing:确定拖动结束的包含对象

Swing: Determining containing object for end of drag

我想知道 swing MouseMotionEvent(或 MouseReleased)结束于什么对象。问题是 MousePressed 和 MouseReleased 事件都转到 "press" 下的对象,而不是释放.

这里有一个可以更好解释的人为示例:

用户看到一个屏幕上有一些球和一些篮子,并被告知将球拖到篮子里。每个球代表应用程序 space 中的某个实体,每个篮子代表应用程序 space 中要采取的某些操作。从 Swing 的角度来看,球和篮子分别实现为高度覆盖的 JButton。在 mousePressed 上,球将其身份存储在已知位置。我希望 mouseReleased 被篮子中的 MouseListener 捕获,它检查已知位置的球身份,然后进入程序逻辑并执行该篮子代表的任务。

但据我了解 Swing(实际上是 AWT),mouseReleased 事件转到包含 mousePressed 事件(即球)的组件。除了查看 X 和 Y(这看起来很糟糕)之外,我如何确定 mouseReleased 发生在哪个篮子中? (如果 mouseRelease 发生在任何篮子之外,我将需要采取某种默认重置操作。这可以通过底层 JPanel 中的 mouseEvent 处理程序来完成)。

(请不要告诉我这是一个糟糕的界面。我给出的示例不是真实的。它以我认为易于形象化和理解的方式抽象出我遇到的问题。)

If the mouseRelease happened outside of any basket, I'll need to take some sort of default reset action -

使用 Drag and Drop API 然后你将只能掉落支持你掉落的组件。

Other than looking at X and Y (which seems an atrocious kludge)

为什么?该事件没有信息,因此您需要以某种方式获取它。所以如果你不想使用 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);