在java键绑定(bind)中,在Windows中,我如何识别何时按下CTRL键本身,而不是按下AltGr时?
我的进程处理必须由CTRL键本身启动,并且我还需要知道CTRL键何时释放。
瑞士/德国法国用户出现问题:要输入“@”,他们必须同时按“AltGr”+“2”。 在这种情况下,Windows 将 AltGr 转换为 ALT + CTRL,并且我的进程被错误启动。
我指出我想使用按键绑定(bind)。
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class MyCtrl extends JFrame {
void init() {
JPanel panel = new JPanel();
setContentPane(panel);
InputMap inputMap = panel.getInputMap();
ActionMap actionMap = panel.getActionMap();
/**
* action for CTRL
*/
KeyStroke controlKey = KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, InputEvent.CTRL_MASK);
inputMap.put(controlKey, "ctrl");
actionMap.put("ctrl", new CtrlAction());
/**
* action for release CTRL
*/
KeyStroke releaseControlKey = KeyStroke.getKeyStroke("released CONTROL");
inputMap.put(releaseControlKey, "release ctrl");
actionMap.put("release ctrl", new ReleaseCtrlAction());
}
public class CtrlAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
if(AltGr is pressed)
{// do nothing}
else
System.out.println("control");
}
}
public class ReleaseCtrlAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
if(AltGr is pressed)
{// do nothing}
else
System.out.println("release control");
}
}
/**
* main
*/
public static void main(String[] a) {
MyCtrl myProjet = new MyCtrl();
myProjet.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myProjet.setPreferredSize(new Dimension(200, 100));
myProjet.init();
myProjet.pack();
myProjet.setVisible(true);
}
}
最佳答案
我能想到两种解决方案:
不使用面板的输入/操作映射 - 在 KeyListener() 中处理操作。这似乎是一个直接的解决方案。
将 ALT 键处理添加到输入/操作映射中,并在处理程序中保留一个可以在控制处理程序中检查的标志。
不过我更喜欢 (1)。
关于java 键绑定(bind) - 不要捕获 Windows 中 AltGr 的 CTRL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32034982/