简体   繁体   English

如何使用 java.awt 支持 ctrl + shift + numpad 键

[英]How to support ctrl + shift+ numpad keys using java.awt

I want to associate ctrl + shift + numpad 7 to an action map.我想将ctrl + shift + numpad 7关联到一个动作地图。 Basically I'm trying to bind my actions to keyboard shortcuts and want the same behavior as of the number keys pressed from top or number keypressed from right numbers of keyboard.基本上,我试图将我的操作绑定到键盘快捷键,并希望与从顶部按下的数字键或从正确的键盘数字按下的数字键相同的行为。

I'm able to map我可以映射

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), "Ctrl+4");

but cannot map但不能映射

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), "Ctrl+4");

Here is the code that I am trying to execute:这是我尝试执行的代码:

package testmaik;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class KeyBindingsTest {

public static void main(String[] args) {
    new KeyBindingsTest();
}

public KeyBindingsTest() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            }

            JFrame frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new TestPane());
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    });
}

public class TestPane extends JPanel {

    private JLabel state;

    /**
     * 
     */
    public TestPane() {
        setLayout(new GridBagLayout());
        state = new JLabel("Nothing here");
        add(state);

        InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.CTRL_DOWN_MASK), "Ctrl+1");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_2, KeyEvent.CTRL_DOWN_MASK), "Ctrl+2");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, KeyEvent.CTRL_DOWN_MASK), "Ctrl+1");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, KeyEvent.CTRL_DOWN_MASK), "Ctrl+2");
        im.put(KeyStroke.getKeyStroke("ctrl 7"), "ctrl+7");
        im.put(KeyStroke.getKeyStroke("ctrl shift 7"),  "Ctrl+3");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), "Ctrl+4");

        ActionMap am = getActionMap();
        am.put("Ctrl+1", new MessageAction("Ctrl+1"));
        am.put("Ctrl+2", new MessageAction("Ctrl+2"));
        am.put("Ctrl+3", new MessageAction("Ctrl+3"));
        am.put("ctrl+7", new MessageAction("ctrl+7"));
        am.put("Ctrl+4", new MessageAction("Ctrl+4"));
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    public class MessageAction extends AbstractAction {

        private String message;

        public MessageAction(String message) {
            this.message = message;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            state.setText(message);
        }

    }

}

}

Please help.请帮忙。

An alternate solution: Try this im your TestPane class and you can catch the event itself:另一种解决方案:在您的 TestPane 类中尝试此操作,您可以捕获事件本身:

getRootPane().getContentPane().getToolkit().addAWTEventListener(new AWTEventListener() {

        public void eventDispatched(final AWTEvent event) {
            if (event.getID() == KeyEvent.KEY_PRESSED) {
                final KeyEvent keyEvent = (KeyEvent) event;
                switch (keyEvent.getKeyCode()) {
                    case KeyEvent.VK_NUMPAD7:
                        if(keyEvent.isControlDown() && keyEvent.isShiftDown()) {
                            //do Stuff
                        }
                        break;
                }
            }
        }

    }, AWTEvent.KEY_EVENT_MASK);

I am not sure what's wrong with your event map.我不确定你的事件地图有什么问题。

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

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