MouseMotionListener 不响应 JButtons

MouseMotionListener doesn't respond over JButtons

所以我有一个名为 contentPanel 的 JPanel,它包含 2 个内部容器。第一个是 scorePanel,它包含几个按钮、一个滑块和一个标签。另一个是 buttonPanel,它是 JButton 的网格。

在我的 contentPanel class 中,我实现了 MouseMotionListener 接口并将此侦听器添加到 buttonPanel 称为按钮。

我遇到的问题是 mouseMoved 方法从未被调用,当鼠标悬停在按钮上时我无法获取鼠标坐标。相反,如果我将侦听器添加到每个按钮,我将获得鼠标坐标,但仅当它们与鼠标悬停在其中的按钮的原点相关时。此外,如果我将侦听器添加到 contentPanel,我会从该容器的原点开始获取鼠标坐标,但它不会通过按钮触发事件。

任何人都可以解释如何缓解这个问题并在没有 JButton 阻碍的情况下从按钮面板的原点获取鼠标坐标吗?

蒂亚

*更新:* 我做了一项更改,启用了我正在寻找的正确行为,但只是有一个警告。我将 GridLayout 中按钮之间的填充 space 调整为 15px,现在当鼠标进入这些中间区域时,mouseEvent 触发。这将实现与我所寻求的相同的效果。

我找到了一些关于 JButton 或其他组件使用 MouseEvents 并且不将事件传递给它们的父组件的研究。该解决方案是由 Sun/Oracle 的团队成员推荐的,即重新将事件分派给 JComponent 的父级,这将是它的容器。

这是通过以下代码实现的:

JComponent subComponent = new JButton("JButton");    
MouseAdapter redispatcher = new MouseAdapter()
{
  @Override
  public void mouseEntered(MouseEvent evt)
  {
    dispatchMouseEvent(evt);
  }      
  @Override
  public void mouseExited(MouseEvent evt)
  {
    dispatchMouseEvent(evt);
  }
  @Override
  public void mouseMoved(MouseEvent evt)
  {
    dispatchMouseEvent(evt);
  }
  @Override
  public void mousePressed(MouseEvent evt)
  {
    dispatchMouseEvent(evt);
  }
  private void dispatchMouseEvent(MouseEvent evt)
  {
    Container parent = evt.getComponent().getParent();
    parent.dispatchEvent(SwingUtilities.convertMouseEvent(evt.getComponent(), evt, parent));
  }            
};
subComponent.addMouseListener(redispatcher);
subComponent.addMouseMotionListener(redispatcher);

这不可避免地是传递事件的一个很好的解决方案。 (http://www.jyloo.com/news/?pubId=1315817317000)