gpt4 book ai didi

java - 自动隐藏 JMenuBar

转载 作者:搜寻专家 更新时间:2023-10-31 20:07:17 28 4
gpt4 key购买 nike

当我运行以下代码时,菜单栏会在光标移动到窗口的上部时显示。问题是,当我向上移动光标打开菜单但没有选择任何东西,然后将光标移出菜单栏区域时,它变得不可见但菜单的元素留在屏幕上。

我试图实现的是一个“自动隐藏”菜单栏,当鼠标进入 JFrame 中的特定区域时该菜单栏变得可见。

public class Test extends JFrame {

public Test() {
setLayout(new BorderLayout());
setSize(300, 300);

JMenuBar mb = new JMenuBar();
setJMenuBar(mb);
mb.setVisible(false);


JMenu menu = new JMenu("File");
mb.add(menu);

menu.add(new JMenuItem("Item-1"));
menu.add(new JMenuItem("Item-2"));

addMouseMotionListener(new MouseAdapter() {

@Override
public void mouseMoved(MouseEvent e) {
getJMenuBar().setVisible(e.getY() < 50);
}
});
}

public static void main(String args[]) {
new Test().setVisible(true);
}
}

我想我找到了解决方法:如果菜单栏可见并且 JFrame 接收到 mousemove 事件,则发送 ESC 键以关闭任何打开的菜单。

 addMouseMotionListener(new MouseAdapter() {

@Override
public void mouseMoved(MouseEvent e) {
if (getJMenuBar().isVisible()) {
try {
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ESCAPE);
} catch (AWTException ex) {
}

}
getJMenuBar().setVisible(e.getY() < 50);
}
});

此解决方法取决于外观(ESC 键的含义)。不管怎样,对我来说没问题。

最佳答案

您可能可以通过检查是否从 JMenuBar 中选择了任何菜单来使其工作:

public void mouseMoved(MouseEvent e) {
JMenuBar lMenu = getJMenuBar();
boolean hasSelectedMenu = false;
for (int i=0 ; i< lMenu.getMenuCount() ; ++i)
{
if (lMenu.getMenu(i).isSelected())
{
hasSelectedMenu = true;
break;
}
}

if(!hasSelectedMenu)
lMenu.setVisible(e.getY() < 50);
}

在这种情况下,只要您单击 JFrame 中的其他位置,它就会消失。

但是,不完全是,因为它只会在 mouseMoved 上更新。我建议您对 mouseClicked 进行相同的检查,以确保它在单击而不移动时消失。

关于java - 自动隐藏 JMenuBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2911887/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com