Автоскройте JMenuBar

Когда я выполняю следующий код, шоу строки меню, когда курсор перемещается в верхнюю часть окна. Проблема, когда я перемещаю курсор вверх для открытия меню, но ничего не выбираю и затем перемещаю курсор из область строки меню, это становится невидимым, но элементы меню остаются на экране.

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

5
задан Unihedron 13 August 2014 в 02:19
поделиться

1 ответ

Вероятно, вы можете заставить его работать, проверяя, выбрано ли какое-либо меню из 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, чтобы убедиться, что он исчезает при щелчке без перемещения.

2
ответ дан 14 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: