Когда я выполняю следующий код, шоу строки меню, когда курсор перемещается в верхнюю часть окна. Проблема, когда я перемещаю курсор вверх для открытия меню, но ничего не выбираю и затем перемещаю курсор из область строки меню, это становится невидимым, но элементы меню остаются на экране.
То, чего я - попытка достигнуть, является "автоскрыть" строкой меню, которая становится видимой, когда мышь вводит определенный регион в 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, чтобы убедиться, что он исчезает при щелчке без перемещения.