Java JMenu setAccelerator()问题

时间:2010-02-27 20:21:08

标签: java swing jmenubar

当我将setAccelerator()设置为Control + A或Control + P并运行程序时,它不会检测到击键。

以下是代码:

  menuItem = new JMenuItem("About");
  menuItem.setActionCommand("About");
  menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK));
  menuItem.setMnemonic(KeyEvent.VK_A);
  menuItem.addActionListener(this);
  menu.add(menuItem);

然后当它被按下时,它应该调用Action Listener:

public void actionPerformed(ActionEvent e) {

  if(e.getActionCommand().equals("About")) {

   System.out.println("About");

  }
}

如果重要的话,我在Mac上运行它。

2 个答案:

答案 0 :(得分:5)

Control-A和Control-P都是可能已被拦截的击键,具体取决于您的平台和键盘焦点。 Control-A可能已被拦截并解释为“全选”,Control-P可能已被拦截并解释为“粘贴”。

如果您选择不太常用的击键而不是“Control-A”,例如“Control-Shift-A”或“Control-B”,该怎么办?以下是使用Control-Shift-A而不是Control-A的代码的修改版本:

menuItem = new JMenuItem("About");
menuItem.setActionCommand("About");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK | Event.SHIFT_MASK));
menuItem.setMnemonic(KeyEvent.VK_A);
menuItem.addActionListener(this);
menu.add(menuItem);

我使用the JMenu demo from the Swing tutorial在我自己的系统上测试了这个更改,我发现(正如你所做的)注册Control-A,因为加速器没有效果。但是,将Control-Shift-A注册为加速器非常有效。

答案 1 :(得分:-1)

不确定它是否会有所帮助,但您使用Event.CTRL_MASK代替KeyEvent.CTRL_MASK