【问题标题】:MouseMotionListener doesn't respond over JButtonsMouseMotionListener 不响应 JButtons
【发布时间】:2016-07-03 03:23:20
【问题描述】:

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

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

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

谁能解释一下如何缓解这个问题并从按钮面板的原点获取鼠标坐标而没有 JButton 阻塞?

蒂亚。

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

【问题讨论】:

  • 可能有一个或多个组件(如JButtons)在鼠标事件到达您的容器之前就已经消耗了它们。您能否详细说明您希望通过MouseMotionListener 实现的目标?
  • @MadProgrammer 我正在尝试获取鼠标到按钮网格中任何指定按钮中心的距离。您能否解释一下按钮如何消耗鼠标事件以及可能的解决方案?
  • JButton's 有MouseListeners,由于这些工作方式,它们消耗鼠标事件,因此它们下面的任何东西都不会被通知

标签: java swing layout jbutton


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2021-02-25
    • 2015-10-19
    • 2012-10-12
    相关资源
    最近更新 更多