Java 鼠标在几个面板上移动?

Java 鼠标在几个面板上移动?,java,swing,Java,Swing,我的用户故事如下: 为了升级一座塔,玩家必须从商店里拖出一把枪,把它扔到塔上 实际上,GameView包含BattlefieldCanvas和ShopView。此外,ShopView为每支可购买的枪都包含一个GunSelector。所有这些人都是JPanel的子类 我目前正在使用一个MousListener来处理在BattlefieldCanvas上执行的几个动作;我想我可以用同样的东西来处理鼠标从一个枪选择器到战场画布的移动(=跨越多个面板),所以我尝试将相同的鼠标侦听器添加到枪选择器和战场

我的用户故事如下:

为了升级一座塔,玩家必须从商店里拖出一把枪,把它扔到塔上

实际上,
GameView
包含
BattlefieldCanvas
ShopView
。此外,
ShopView
为每支可购买的枪都包含一个
GunSelector
。所有这些人都是
JPanel
的子类

我目前正在使用一个
MousListener
来处理在
BattlefieldCanvas
上执行的几个动作;我想我可以用同样的东西来处理鼠标从一个
枪选择器到
战场画布的移动(=跨越多个面板),所以我尝试将相同的
鼠标侦听器添加到枪选择器和战场

问题:不起作用。当鼠标在战场上实际释放时,事件对象的
getSource()
方法返回对枪选择器的引用


PS:与枪选择器不同,塔不是摆动组件,而是通过
paintComponent
方法绘制的图像。

1)回答您最初的问题,即为什么源仍然是组件鼠标被点击的原因。您只需阅读以下内容:

公共对象getSource()

事件最初发生在其上的对象

返回: 最初发生事件的对象

2) 现在,我们如何获得鼠标释放的实际组件。您可以尝试以下方法:

@Override
public void mouseReleased(MouseEvent e) {
    Component theCOmponentMouseIsReleasedOn = frame.findComponentAt( e.getLocationOnScreen() );
}
您不必总是在框架上调用
findComponentAt
,您可以调用包含您的
BattlefieldCanvas

的容器,多亏了,我最终成功地用
currentView=e.getSource()覆盖了我想要的
mouseEntered
并在
mousererelease
方法中计算鼠标相对位置,使组件的绝对位置(
bfLoc=((战场画布)currentView).getLocationOnScreen()
)和鼠标绝对位置:
新点2D.Double(e.getXOnScreen()-bfLoc.getX(),e.getYOnScreen()之间存在差异-bfLoc.getY())