【问题标题】:Keylistener not responding to numlock numbersKeylistener 没有响应 numlock 数字
【发布时间】:2014-07-01 02:32:06
【问题描述】:

我正在制作一个监听 ctrl-1 和 ctrl-2 的 keylistener。

我正在为团队进行测验。如果他们想回答,团队 1 应该按 ctrl-1。第 2 队如果想回答,请按 ctrl-2。

我选择 ctrl 的原因是因为有 2 个控制键。因此 2 支球队可以在 1 个键盘上互相对抗。

我希望团队 1 使用左侧控件和 F1-F12 下的数字。 团队 2 使用正确的控件和数字锁上的数字。

我的代码注册了团队 1 的触发器,而不是团队 2 的触发器。 这是我的代码:

        public void keyPressed(KeyEvent e) {
            if((QuizController)getController() != null){
                if(e.getKeyCode () == KeyEvent.VK_1){
                    if((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)
                        System.out.println("Team 1");
                }
                if(e.getKeyCode () == KeyEvent.VK_2){
                    if((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)
                        System.out.println("Team 2");
                }
            }

        }

编辑:我只是用键绑定做的,给出了同样的问题,这里是代码。

AbstractAction team1 = new AbstractAction() {
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("Team 1");

        }
    };

AbstractAction team2 = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            System.out.println("Team 2");

        }
    };

    getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_1, java.awt.event.InputEvent.CTRL_DOWN_MASK),"actionMap1");
    getActionMap().put("actionMap1", team1);

    getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_2, java.awt.event.InputEvent.CTRL_DOWN_MASK),"actionMap2");
    getActionMap().put("actionMap2", team2);

谢谢!

【问题讨论】:

  • 请应该是 KeyEvent.VK_1 && KeyEvent.CTRL_MASK ???编辑 if (code == KeyEvent.VK_1 && modifiers == KeyEvent.CTRL_MASK) {
  • 应该很容易通过使用 KeyBindings 而不是 KeyListener
  • 您是否测试过单独的 1 或 2(没有 CTRL)是否有效?
  • 键盘绑定怎么办,不太懂教程...
  • 我把它放在 JPanel 的构造函数中:setFocusable(true);

标签: java swing keylistener key-bindings num-lock


【解决方案1】:

首先,我强烈推荐使用key bindings API

第二个KeyEvent.VK_1 与小键盘+1 引发的事件不同,这是由KeyEvent.VK_NUMPAD1 触发的,它是不同的按键事件,就像功能键引发KeyEvent.VK_F112 事件一样.

例如...

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

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

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

        }

    }

}

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多