MouseListener跨几个面板?

时间:2017-06-08 14:57:28

标签: java swing

我的用户故事如下:

  

为了升级塔,玩家必须从商店拖出一把枪并将其放在塔上。

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

我目前正在使用MousListener来处理对BattlefieldCanvas执行的多项操作;我以为我可以使用相同的东西来处理从GunSelectorBattlefieldCanvas之一(=跨越几个面板)的鼠标之旅,所以我尝试将相同的MousListener添加到枪支选择器和战场。

http://aygix.free.fr/down.php?path=stackoverflow/Odepax/mouse-listener-across-several-panels.png

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

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

1 个答案:

答案 0 :(得分:1)

1)回答原始问题,为什么源仍然是组件鼠标被点击。您只需阅读JavaDoc

即可
  

public Object getSource()

     

最初发生事件的对象。

     

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

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

@Override
public void mouseReleased(MouseEvent e) {
    Component theCOmponentMouseIsReleasedOn = frame.findComponentAt( e.getLocationOnScreen() );
}

您不需要始终在框架上致电findComponentAt,您可以拨打包含BattlefieldCanvas的容器。