MouseMotionListener不响应JButton

时间:2016-03-17 00:11:49

标签: java swing layout jbutton

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

enter image description here

在我的contentPanel课程中,我实现了MouseMotionListener接口,并将此监听器添加到buttonPanel调用按钮。

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

任何人都可以解释如何缓解这个问题并从按钮面板的原点获取鼠标坐标而不受JButton阻碍吗?

蒂亚。

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

1 个答案:

答案 0 :(得分:0)

我找到了一些关于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