在Java卡游戏中实现对对象进行鼠标打开/关闭的检测

时间:2013-12-18 00:38:36

标签: java swing mouseevent mouselistener

我正在修改open source Java card game。基本上,我想检测用户何时将鼠标悬停在特定卡上。使用MouseListener的mouseExit / mouseEntered函数实现这一点应该非常简单,但是我遇到了麻烦。

GameArea.java文件中,初始化一系列堆栈(DealtCardStack对象)并分配一个鼠标处理程序(第175行)。这个处理程序的鼠标函数几乎包含了用于在主堆栈之间移动和玩牌的所有代码,可以从第479行开始找到它。我在这个处理程序中添加了一个mouseExited / Entered函数,但它只适用于进入/退出堆栈。这种情况适用于某些情况,但有一些情况下它不够准确,我需要将其检测到堆栈中的特定卡,因此它可以检测在同一堆栈中的离开和进入卡。

我尝试创建一个新的鼠标监听器并将其附加到每张卡片上(卡片在Deck class第75行中创建)。当我创建一个鼠标监听器时,它强制我覆盖mouseMove,Click等,所以我把它们留空了,只是将一些代码添加到mouseEnter和mouseExit(仅用于测试目的的打印)。我测试了程序并且打印出现了,因为我输入/留下了我想要的卡片,但无论如何我无法再点击或拖动,或者与卡片进行交互,基本上游戏的功能(在GameArea中建立)被删除了。为什么是这样? java一次只支持一个程序中的一个鼠标处理程序吗?我不认为是这种情况,因为GameArea似乎有两个处理程序(一个用于处理角落甲板上的事件)。我想也许分配给每张卡的新鼠标处理程序覆盖了GameArea中指定的所有功能,但是我很困惑,因为将鼠标处理程序分配给ADECards,这是一个DealtCardStacks数组,并且这个新处理程序被分配给各个卡。

那么,是否有人知道为什么我在将这些鼠标处理程序分配给程序中的各种对象时遇到问题?或者是否有更好/更容易的解决方案来实现我想要做的事情?

我发现this question似乎与我的问题非常相关,但我尝试实现了一个MouseTrackListener并且没有读取该类型,并且无法从任何地方导入。

我试图让问题尽可能清楚,项目中有很多代码,但我认为你只需要在粗体指定的行中阅读链接的类。如果有什么不清楚请告诉我。

谢谢!

2 个答案:

答案 0 :(得分:0)

我不确定,但是如果你将一个mouseListener添加到Deck中,你就不要添加mouseMotionListener ......是不是有意?它不应该也添加了mouseMotionListener,以便你可以接收拖拽?

但我认为将听众添加到你的Deck中的每张卡都是正确的。

答案 1 :(得分:0)

所以我一直在解决它。我有用于检测在mouseMove函数中移动到卡上的代码,它使用over_card和new_over_card变量来检测更改,以便检测同一堆栈中的进入和退出卡。然后我只在堆栈对象上使用mouseExit来检测完全离开堆栈。这些结合起来可以很好地覆盖所有卡片的移入和移出。