Java 摆动:确定拖动结束时包含的对象

Java 摆动:确定拖动结束时包含的对象,java,swing,awt,Java,Swing,Awt,我想知道swing MouseMotionEvent(或MouseReleased)以什么对象结束。问题是,MousePressed和MouseRelease事件都会转到“press”下的对象,而不是释放 下面是一个人为的例子,可以更好地解释: 用户看到屏幕上有一些球和一些篮子,并被告知将球拖到篮子上。每个球代表应用程序空间中的某个实体,每个篮代表应用程序空间中要采取的某些行动。从Swing的角度来看,球和篮单独实现为高度重写的JButton。在鼠标上,球将其身份存储在已知的位置。我想让鼠标在篮

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

下面是一个人为的例子,可以更好地解释:

用户看到屏幕上有一些球和一些篮子,并被告知将球拖到篮子上。每个球代表应用程序空间中的某个实体,每个篮代表应用程序空间中要采取的某些行动。从Swing的角度来看,球和篮单独实现为高度重写的JButton。在鼠标上,球将其身份存储在已知的位置。我想让鼠标在篮子里被一个鼠标听者抓住,它在已知的位置检查球的身份,然后进入程序逻辑并执行篮子代表的任务

但据我所知,Swing(实际上是AWT)的鼠标释放事件会转到包含鼠标释放事件(即球)的组件。除了看X和Y(这似乎是一个可怕的乱七八糟的问题)之外,我怎么知道老鼠是在哪个篮子里发生的呢?(如果mouseRelease发生在任何篮子之外,我将需要执行某种默认重置操作。这可以由基础JPanel中的mouseEvent处理程序完成)

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

如果鼠标释放发生在任何篮子之外,我需要采取某种默认重置操作-

使用API后,您将只能删除支持您删除的组件

除了看X和Y(这似乎是一个可怕的混乱)

为什么??事件没有信息,因此您需要以某种方式获取它。因此,如果您不想使用DNDAPI,那么您需要自己完成这项工作

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);
如果鼠标释放发生在任何篮子之外,我需要采取某种默认重置操作-

使用API后,您将只能删除支持您删除的组件

除了看X和Y(这似乎是一个可怕的混乱)

为什么??事件没有信息,因此您需要以某种方式获取它。因此,如果您不想使用DNDAPI,那么您需要自己完成这项工作

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);

谢谢卡尼克。你已经提供了答案。我之所以认为使用X和Y是一个非常糟糕的问题(或者说是一个非常丑陋的问题),是因为我不知道SwingUtilities和你提到的三个函数。有了这三个功能,这是相当合理的。我认为用每个组件的封装外形来确定X,Y是否在该封装外形内是很难看的。getDeepestComponentAt()似乎处理了很多非常肮脏的工作。@CraigSmilovitz,很高兴它起到了作用。别忘了点击复选标记“接受”答案,这样人们就知道问题已经解决了。我会点击复选标记。我没有意识到。再次感谢汉克斯·卡尼克尔。你已经提供了答案。我之所以认为使用X和Y是一个非常糟糕的问题(或者说是一个非常丑陋的问题),是因为我不知道SwingUtilities和你提到的三个函数。有了这三个功能,这是相当合理的。我认为用每个组件的封装外形来确定X,Y是否在该封装外形内是很难看的。getDeepestComponentAt()似乎处理了很多非常肮脏的工作。@CraigSmilovitz,很高兴它起到了作用。别忘了点击复选标记“接受”答案,这样人们就知道问题已经解决了。我会点击复选标记。我没有意识到。感谢againI,我将从了解DnD如何工作以及新的基于传输的API如何在核心DnD API上工作开始,这将更深入地解释DnD如何工作以及新的基于传输的API如何在核心DnD API上工作开始