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

标签 java swing awt

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

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

用户看到一个带有一些球和一些篮子的屏幕,并被告知将球拖到篮子中。每个球代表应用程序空间中的某个实体,每个篮子代表在应用程序空间中要采取的一些操作。从 Swing 的角度来看,球和篮子是作为高度重写的 JButton 单独实现的。当鼠标按下时,球将其身份存储在已知位置。我希望 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)

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

关于java - Swing:确定拖动结束时包含的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35413907/

相关文章:

java - 在swing中的JMenu中添加图标和文本

java - 运行 Jar 时强制启用 spring-boot DevTools

java - 鼠标滚轮监听器在 jscrollbar 中不起作用

java - 使用 MouseListener 和 MouseMotionListener 绘制矩形

java - JTable:正确显示表的刷新

java - 从 Java jTextArea 获取文本和位置

java - 更改应用程序的背景

java - 如何在 java JDBC 中获取带有列名/标题的数据

Java - ServerSocket IP 地址

java - 如何使用 Java AWT 显示信息?