1

我想知道为什么Nimbus会以某种方式与Virtual keys发生冲突。查看我在下面制作的示例:

    public class buttontest implements ActionListener {

    JMenuItem close =new JMenuItem("Close");

    public static void main (String[] args){

    try {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (UnsupportedLookAndFeelException e) {
        // handle exception
    } catch (ClassNotFoundException e) {
        // handle exception
    } catch (InstantiationException e) {
        // handle exception
    } catch (IllegalAccessException e) {
        // handle exception
    }

    }

    public buttontest(){

    JFrame test = new JFrame();
    JMenuBar bar=new JMenuBar();
    JMenu file=new JMenu("File");

    close.setMnemonic(KeyEvent.VK_C);
    file.setMnemonic(KeyEvent.VK_F);

    test.setExtendedState(test.getExtendedState() | test.MAXIMIZED_BOTH); // Maximized Window or setSize(getMaximumSize())
    test.setDefaultCloseOperation(1);

    bar.add(file);
    file.add(close);
    test.setJMenuBar(bar);
    test.setVisible(true);  
}

public void actionPerformed(ActionEvent e){

    if(e.getSource()==close){
        System.exit(0);
    }
}

}

它的编写方式,您可以尝试使用虚拟键。您将看到 Alt F 可以打开“文件”菜单,但 Alt C 不会关闭应用程序。换句话说,如果您注释 Nimbus 代码,则两个虚拟键都可以使用。

我对这个“错误”进行了一项研究(或者可能是我做错了我不知道的事情),但直到现在我一无所获。有人经历过这个吗?

4

1 回答 1

3

您必须使用setAccelerator()以下方法JMenuItem

close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK ));

来自 Javadoc:
JMenuItem#setAccelerator(KeyStroke)

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


附加说明:

  1. 替换LookAndFeelInfo为,UIManager.LookAndFeelInfo因为它是 inside 的内部UIManager

  2. main方法中调用构造函数。

  3. 将参数更改setDefaultCloseOperation(1)为 3 作为3 = JFrame.EXIT_ON_CLOSE,但1=JFrame.HIDE_ON_CLOSE它隐藏了框架,就我个人而言,我讨厌它,因为为关闭框架创建的关闭按钮,而不是像 Skype 一样隐藏它。

  4. actionListener添加到关闭按钮:close.addActionListener(this);

于 2013-07-26T15:36:12.747 回答