[英]How to Use Key event dispatcher for keyboard shortcuts
我想在我的jframe或jdialog中使用快捷键来访问组件(例如:这里我使用Ctrl + N来访问jframe的NEW Button),所以我能够使用键事件分发程序来完成我的任务,但是事情是当按下快捷键,相关的按键事件将递归触发,我该如何停止呢? 我该如何处理一次? 这是我的代码。
public void FocuseComponent(JComponent component) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
switch (e.getID()) {
case KeyEvent.KEY_PRESSED:
if (e.getKeyCode() == e.VK_N) {
component.requestFocusInWindow();
}
break;
case KeyEvent.KEY_RELEASED:
break;
case KeyEvent.KEY_TYPED:
break;
}
return false;
}
});
}
}
这是一个示例,该示例如何为窗口注册全局的键绑定:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class TestKeyHandling {
private static final String CTRL_N_KEY = "nKey";
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frm = new JFrame("Test");
Action act = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frm, "Ctrl + N pressed!");
}
};
frm.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control N"), CTRL_N_KEY);
frm.getRootPane().getActionMap().put(CTRL_N_KEY, act);
frm.add(new JTextField(20), BorderLayout.NORTH);
frm.add(new JTextField(20), BorderLayout.SOUTH);
frm.pack();
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setLocationRelativeTo(null);
frm.setVisible(true);
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.