3

当我将 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 上的 Eclipse 中运行它。

4

2 回答 2

6

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);

我使用Swing 教程中的 JMenu 演示在我自己的系统上测试了此更改,我发现(与您所做的一样)将 Control-A 注册为加速器没有任何效果。但是,将 Control-Shift-A 注册为加速器效果很好。

于 2010-02-27T20:59:00.063 回答
-1

不确定它是否有帮助,但你正在使用Event.CTRL_MASK而不是KeyEvent.CTRL_MASK

于 2012-02-02T17:44:24.180 回答