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

次に、それが押されると、アクション リスナーを呼び出す必要があります。

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-Shift-A」や「Control-B」など、「Control-A」の代わりにあまり使用されないキーストロークを選択した場合はどうなりますか?Control-Aの代わりにControl-Shift-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 に答える