java 键绑定(bind) - 不要捕获 Windows 中 AltGr 的 CTRL

标签 java key-bindings ctrl

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

}

最佳答案

我能想到两种解决方案:

  1. 不使用面板的输入/操作映射 - 在 KeyListener() 中处理操作。这似乎是一个直接的解决方案。

  2. 将 ALT 键处理添加到输入/操作映射中,并在处理程序中保留一个可以在控制处理程序中检查的标志。

不过我更喜欢 (1)。

关于java 键绑定(bind) - 不要捕获 Windows 中 AltGr 的 CTRL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32034982/

相关文章:

Java Swing 使用箭头按钮发送导航命令

java - 按住 ALT 键并单击,删除 JList 上选定的元素

java - 键绑定(bind)和按住键

javascript - 避免在 Opera 中使用 Ctrl+Enter(单击)创建新标签

javascript - 在没有按键事件的情况下检测 CTRL 和 SHIFT 键?

javascript - 事件 Shift 键组合

java - 格式化具有固定宽度列的文本表格

java - Java中的字符串...参数

java - 如何处理 WebView 中的 JavaScript 对话框弹出

java - 如何读取 Jlist 中的复选框状态