菜单栏隐藏时,JMenuItem加速器不工作



此问题是此问题的后续问题。

我有一个JMenuBar,它的行为就像Firefox和iTunes中的菜单栏。也就是说,菜单栏最初是隐藏的,但当您按Alt时,菜单栏会出现。

另一个问题的答案解决了实现该功能的问题,但它带来了另一个问题:当JMenuBar不可见时,JMenuItem加速器不工作。换句话说,必须先按AltCTRL+F(已安装的加速器)才能工作。

但事实并非如此,因为setAccelerator()方法声明了以下内容:

public void setAccelerator(KeyStroke KeyStroke)

设置在不导航菜单层次结构的情况下调用菜单项的动作侦听器的组合键。UI有责任安装正确的操作请注意,当键入键盘快捷键时,无论当前是否显示菜单,它都会工作

所以,我想知道这是否是另一个Java错误?

SSCCE(要显示菜单,请按Alt,安装的加速器是"查找"的CTRL+F,它会显示一个用于输入的伪JOptionPane):

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class MenuBarTest extends JFrame {
    public MenuBarTest() {
        JMenu jMenu1 = new JMenu();
        JMenu jMenu2 = new JMenu();
        final JMenuBar jMenuBar1 = new JMenuBar();
        JMenuItem jMenuItem1 = new JMenuItem();
        JMenuItem jMenuItem2 = new JMenuItem();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jMenu1.setText("File");
        jMenuItem1.setText("jMenuItem1");
        jMenu1.add(jMenuItem1);
        jMenuBar1.add(jMenu1);
        jMenu2.setText("Edit");
        jMenuItem2.setText("Find");
        jMenu2.add(jMenuItem2);
        jMenuBar1.add(jMenu2);
        setJMenuBar(jMenuBar1);
        jMenuBar1.setVisible(false);
        ChangeListener listener = new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                MenuElement[] elements = MenuSelectionManager.defaultManager().getSelectedPath();
                jMenuBar1.setVisible(elements.length > 0 && elements[0] == jMenuBar1);
            }
        };
        MenuSelectionManager.defaultManager().addChangeListener(listener);
        jMenuItem2.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem2.setText("Find");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                String what = JOptionPane.showInputDialog(MenuBarTest.this, "Search for what?");
                System.out.println(what);
            }
        });
        pack();
        setSize(500,500);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MenuBarTest();
            }
        });
    }
}

仔细阅读您的重点

请注意,当键入键盘快捷键时,无论当前是否显示菜单,它都会工作。

这涉及菜单,而不是其父菜单。这意味着菜单当前可能未显示。然而,真正的(可能没有充分记录)可取的特性是,它必须是显示。已经更新了我对你之前问题的回答。

最新更新