我想知道为什么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代码,两个虚拟密钥都可以工作。
我做了一个关于这个“错误”的研究(或者可能是错误的我做的事我不知道)但直到现在我什么都没发现。有人曾经过这个吗?
答案 0 :(得分:3)
您必须对setAccelerator()
使用JMenuItem
方法:
close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK ));
来自Javadoc:
JMenuItem#setAccelerator(KeyStroke)
设置组合键 调用菜单项的动作侦听器而不导航菜单 层次结构。 UI是安装正确的责任 行动。请注意,键入键盘加速器时,它将起作用 是否当前显示菜单。
附加说明:
将LookAndFeelInfo
替换为UIManager.LookAndFeelInfo
,因为它是UIManager
内的内部类。
在 main 方法中调用构造函数。
将setDefaultCloseOperation(1)
的参数更改为3 3 = JFrame.EXIT_ON_CLOSE
,但隐藏框架的1=JFrame.HIDE_ON_CLOSE
,个人而言,我讨厌它,因为为关闭创建了关闭按钮框架,不隐藏它,如Skype。
将 actionListener 添加到关闭按钮:close.addActionListener(this);