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)
所以我有一个名为 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)