虚拟键盘与Nimbus冲突

时间:2013-07-26 15:22:39

标签: java action nimbus virtual-keyboard

我想知道为什么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代码,两个虚拟密钥都可以工作。

我做了一个关于这个“错误”的研究(或者可能是错误的我做的事我不知道)但直到现在我什么都没发现。有人曾经过这个吗?

1 个答案:

答案 0 :(得分:3)

您必须对setAccelerator()使用JMenuItem方法:

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

来自Javadoc:
JMenuItem#setAccelerator(KeyStroke)

  

设置组合键   调用菜单项的动作侦听器而不导航菜单   层次结构。 UI是安装正确的责任   行动。请注意,键入键盘加速器时,它将起作用   是否当前显示菜单。


附加说明:

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

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

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

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