当JButton在面板中盘旋时,在JPanel上运行MouseExited?

时间:2011-03-25 17:30:56

标签: java swing jbutton mouselistener

我有一个JPanel(我们称之为ctrlPanel),并且使用null布局我在后台放置了一个JLabel。在这个标签的顶部,我有另一个JLabel和一个JButton(默认隐藏)。当用户用鼠标悬停在ctrlPanel上时,我想显示标签和按钮。

通过向ctrlPanel添加mouseAdapter并在mouseExntered时调用showControls(),在mouseExited时调用hideControls(),它几乎可以正常工作。这些使用setVisible来显示/隐藏顶部的组件。

然而,当用户将鼠标悬停在JButton上时,ctrlPanel似乎得到了一个mouseExited调用,这使得JButton“闪烁”(mouseExited-> mouseEntered-> mouseExited等等)。这对我没有意义,因为JButton在 ctrlPanel中是。我的意思是,当悬停在JLabel上时没有问题。

3 个答案:

答案 0 :(得分:1)

我不认为你想要的是可行的 - 内部控制拦截鼠标事件。所以你可以

  • 创建一个鼠标监听器并将其附加到面板,按钮等,并在任何地方正确处理
  • 检查mouseExited()处的坐标,如果鼠标仍在面板内,则忽略该事件

答案 1 :(得分:1)

我采取了哪些措施来处理这个问题,以及在ixula的回答中:

  

"检查mouseExited()处的坐标,如果鼠标仍在面板内,则忽略该事件"

public void mouseExited(MouseEvent e) {
    if(stillInPanel(e.getPoint())) return;
    // Exit logic
}

private boolean stillInPanel(Point2D p) {
    return (YOURJPANEL.contains((Point)p));
}

YOURJPANEL可以是任何容器。

答案 2 :(得分:0)

我也对此进行了测试,并且惊讶地发现了相同的结果。我猜Java的组件不像JavaScript和HTML一样处理鼠标输入和鼠标移出事件(通过事件冒泡)。使用不同的布局管理器没有任何效果。

我认为这是解决此问题最安全的方法:创建自定义JPanel类会覆盖add()方法。这委托给super.add(),但也将其自定义鼠标监听器添加到传入的每个组件中。这样,您仍然可以获得鼠标输入和鼠标退出事件,但您将能够跟踪内部元素小组。无论你在鼠标退出面板时做什么,只会非常简单地生效,并在下一个事件触发时立即撤消。您不应该看到任何可见的GUI更改,但如果您看到闪烁,请尝试使您的窗口双缓冲。