如何在 Java 中检测 Image 对象上的鼠标单击事件?

Posted

技术标签:

【中文标题】如何在 Java 中检测 Image 对象上的鼠标单击事件?【英文标题】:How can you detect a mouse-click event on an Image object in Java? 【发布时间】:2011-09-28 11:11:06 【问题描述】:

在 Java 中实现“Kings' Corners”(美化多人纸牌)。

我试图让玩家将一张牌(图像)从他们的手中拖到桌子上的其他地方。问题是玩家的手是“扇形的”,因此卡片的图像会旋转并且它们重叠。

这是一手牌的例子:

我考虑过将每张卡片设为JPanel,但问题是我必须将卡片在其矩形 JPanel 内旋转,因为他们自己不能被旋转。理想情况下,我想避免使用鼠标 x,y 公式来确定选择哪张卡。

使用事件驱动的方法,我如何确定从手牌中选择哪张牌?

【问题讨论】:

嗯,使用一个或多个派生自 Shape 接口的具体类怎么样?这有一个 contains 方法会派上用场。每次使用 AffineTransform 旋转会很容易。 【参考方案1】:

AWT(和 Swing)组件通常是矩形的(与轴对齐)。

但这并不一定是这样 - 虽然实际边界必须是矩形,但组件使用的实际区域可以更小。组件支持contains(Point) 方法,只要出现点属于哪个组件的问题(例如,鼠标单击),事件调度机制就会调用该方法。 (不同组件的重叠将由父容器内的 z-order 处理。)

您可以基于Shape.contains() 方法实现此方法,使用仿射变换的矩形作为您的形状。每个旋转的组件都将知道自己的形状(或从其 AffineTransform 动态生成它,它也将用于绘画本身)。

有一个自定义的 LayoutManager 也可以安排您的卡片。 (不要使用 CardLayout,尽管有这个名字。)

我不确定我是否会遵循为每张卡片设置单独组件的方式,但您肯定需要一些代表旋转矩形的对象。

【讨论】:

完美运行。解决方案是使用 AffineTransform 的 createTransformedShape,然后检查该形状是否包含鼠标单击的点。谢谢。 @paranoid-android:您应该通过单击此答案左侧的勾号来接受此答案。

以上是关于如何在 Java 中检测 Image 对象上的鼠标单击事件?的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX:如何在屏幕上的任何位置检测鼠标/键事件?

Java - 检测鼠标是不是在屏幕上的任何位置按下

如何检测鼠标在 Java Popup 之外移动?

检测游戏对象上的鼠标点击[重复]

如何检测相机上的运动以移动鼠标

GDI 图形对象上的鼠标 OnDrag 事件