单击MenuItem NewGame。它有效,但按F2不会
mntmNewGame.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int n = JOptionPane.showConfirmDialog(contentPane,"Do you want to play new game ?", "Message!", JOptionPane.OK_CANCEL_OPTION);
}
});
mntmNewGame.addKeyListener(new KeyAdapter() {
public void keyListener(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_F2)
{
int n = JOptionPane.showConfirmDialog(contentPane,"Do you want to play new game ?", "Message!", JOptionPane.OK_CANCEL_OPTION);
}
}
});
答案 0 :(得分:6)
这就是为什么在覆盖方法时应始终使用@Override
... KeyAdapter
没有keyListener
方法 - 它有keyPressed
,{{ 1}}和keyReleased
。例如,您可能需要:
keyTyped
使用mntmNewGame.addKeyListener(new KeyAdapter() {
@Override public void keyTyped(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_F2) {
int n = JOptionPane.showConfirmDialog(
contentPane,
"Do you want to play new game ?",
"Message!",
JOptionPane.OK_CANCEL_OPTION);
// Use n, presumably...
}
}
});
注释,如果您输入错误,编译器会发现您尝试覆盖某些内容,但实际上并没有这样做 - 所以你得到了一个编译时错误,而不仅仅是一个从未调用的方法。
答案 1 :(得分:2)
我假设你正在使用JMenuItem
的东西?在这种情况下,您应该使用JMenuItem#setAccelerator(KeyStroke)
mntmNewGame.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0));
这将触发ActionListener
有关详细信息,请参阅How to Use Menus
如果没有,那么您应该使用key bindings API而不是KeyListener
。 KeyListener
仅在组件具有焦点且具有焦点时才会响应关键事件