简体   繁体   English

Java键绑定-不要在Windows中捕获AltGr的CTRL

[英]java key-bindings - don't catch the CTRL of AltGr in windows

in java key-bindings,in windows , how can I recognize when the CTRL key itself is pressed, and not when the AltGr is pressed ? 在java绑定中,在Windows中,如何识别何时按下CTRL键本身而不是按下AltGr时?

my process treatment must be started by the CTRL key itself, and I also need to know when the CTRL key is released. 我的过程处理必须由CTRL键本身开始,并且我还需要知道何时释放CTRL键。

A problem occurs with swiss / german french users : to type "@" they have to press simultaneously "AltGr" + "2". 瑞士/法国法语用户会出现问题:要键入“ @”,他们必须同时按下“ AltGr” +“ 2”。 In this case, windows transforms AltGr to ALT + CTRL and my process is wrongly launched. 在这种情况下,Windows将AltGr转换为ALT + CTRL,并且错误地启动了我的进程。

I point out that I want to use key-bindigs. 我指出我想使用key-bindigs。

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

} }

I can think of two solutions: 我可以想到两种解决方案:

  1. Instead of using panel's input/action map - handle the operation in KeyListener(). 代替使用面板的输入/动作图-在KeyListener()中处理操作。 This seems to be a direct solution. 这似乎是直接的解决方案。

  2. Add ALT key handling to input/action map and within the handler keep a flag that can be checked in the control handler. 向输入/动作映射添加ALT键处理,并在处理程序内保留一个可在控制处理程序中检查的标志。

I prefer (1) though. 我更喜欢(1)。

Thank you KDM. 谢谢KDM。 As I axplained, I wanted to use keybindings, so I tried your 2nd idea first. 当我道歉时,我想使用键绑定,所以我首先尝试了您的第二个想法。 But I could not catch the ALT modifier launched by window when pressing AltGr. 但是按AltGr时,我无法捕获窗口启动的ALT修饰符。
So I went for the 1st solution, assuming testing ALT/CTRL modifiers is a special case not easy to treat using keybindings. 因此,我选择了第一种解决方案,假设测试ALT / CTRL修饰符是一种特殊情况,使用键绑定不容易处理。
See also here . 另请参阅此处 Improvements / advices are very welcome. 改进/建议非常欢迎。

import java.awt.Dimension;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyCtrl3 extends JFrame {

private class MyDispatcher implements KeyEventDispatcher {
    // usualy one prefer using keybindings - but we are in
    // special case for detect AltGr
    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (e.getID() == KeyEvent.KEY_PRESSED) {
            if (e.isAltGraphDown()) {
                // uncaught in windows
                System.out.println("ALT GRAPH");
            } else if (e.isControlDown()) {
                // fired 1 by windows when press AltGr
                System.out.println("CONTROL");
                // here I launch a timer, 1ms delay is enough 
                // to wait for ALT key if coming
            } else if (e.isAltDown()) {
                // fired 2 by windows when press AltGr
                // here I unarm the timer
                System.out.println("ALT");
            }
        } else if (e.getID() == KeyEvent.KEY_RELEASED) {
            if (e.getKeyCode() == KeyEvent.VK_ALT_GRAPH) {
                System.out.println("ALT GRAPH released");
            } else if (e.getKeyCode() == KeyEvent.VK_ALT) {
                System.out.println("ALT released");
            } else if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
                System.out.println("CONTROL released");
            }
        }
        return false;
    }
}

public MyCtrl3() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setPreferredSize(new Dimension(200, 100));
    KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    manager.addKeyEventDispatcher(new MyDispatcher());
}

public static void main(String[] a) {
    MyCtrl3 myProjet = new MyCtrl3();
    myProjet.pack();
    myProjet.setVisible(true);
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM