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

8

用Java实现“国王角落”(多人接龙)。

我正在尝试允许玩家将手中的一张卡牌(图片)拖到桌子上的其他地方。但问题是玩家的手牌是“扇形”的,因此卡牌的图像被旋转并且重叠在一起。

以下是手牌的示例:

enter image description here

我考虑将每张卡牌作为JPanel,但问题是我必须在其矩形的 JPanel 中旋转卡牌,因为它们本身无法旋转。理想情况下,我想避免使用鼠标x、y公式来确定选择哪张卡牌。

使用基于事件的方法,如何确定从手中选择哪张卡牌?


4
使用一个或多个从Shape接口派生的具体类如何?这些类有一个contains方法,非常方便。使用AffineTransform可以轻松进行旋转。 - Hovercraft Full Of Eels
1个回答

5

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

但这不一定是必须的 - 虽然实际边界必须是矩形的,但组件实际使用的区域可以更小。组件支持一个contains(Point)方法,每当事件分派机制需要确定一个点属于哪个组件时(例如,对于鼠标单击),该方法将被调用。(不同组件之间的重叠将由父容器内部的z顺序处理。)

您可以基于Shape.contains()方法来实现此方法,使用仿射变换的矩形作为您的形状。您旋转的每个组件都将知道自己的形状(或根据其AffineTransform即时生成其形状,与用于绘制自身的AffineTransform相同)。

还需要一个自定义的LayoutManager来安排您的卡片。(不要使用CardLayout,尽管名字相似。)

我不确定是否要按照每张卡片分别创建单独的组件,但您肯定需要一些表示旋转矩形的对象。


完美地工作了。解决方案是使用AffineTransform的createTransformedShape,然后检查该形状是否包含鼠标单击的点。谢谢。 - rtheunissen
@paranoid-android:您应该点击答案左侧的勾号接受此答案。 - Martijn Courteaux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接