我有一个JPanel(我们称之为ctrlPanel),并且使用null布局我在后台放置了一个JLabel。在这个标签的顶部,我有另一个JLabel和一个JButton(默认隐藏)。当用户用鼠标悬停在ctrlPanel上时,我想显示标签和按钮。
通过向ctrlPanel添加mouseAdapter并在mouseExntered时调用showControls(),在mouseExited时调用hideControls(),它几乎可以正常工作。这些使用setVisible来显示/隐藏顶部的组件。
然而,当用户将鼠标悬停在JButton上时,ctrlPanel似乎得到了一个mouseExited调用,这使得JButton“闪烁”(mouseExited-> mouseEntered-> mouseExited等等)。这对我没有意义,因为JButton在 ctrlPanel中是。我的意思是,当悬停在JLabel上时没有问题。
答案 0 :(得分:1)
我不认为你想要的是可行的 - 内部控制拦截鼠标事件。所以你可以
答案 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更改,但如果您看到闪烁,请尝试使您的窗口双缓冲。