Keylistener не отвечает на номера numlock

Я делаю прослушиватель клавиш, который слушает ctrl-1 и ctrl-2.

Я делаю викторину для команд. Команда 1 должна нажать Ctrl-1, если они хотят ответить. Команда 2 должна нажать Ctrl-2, если они хотят ответить.

Причина, по которой я выбрал ctrl, заключается в том, что есть 2 клавиши управления. Таким образом, 2 команды могут играть друг против друга на 1 клавиатуре.

Я хочу, чтобы команда 1 использовала левое управление и числа под F1-F12. И команда 2, чтобы использовать правый контроль и цифры на numlock.

Мой код регистрирует триггеры команды 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);

Благодарю вас!


person user3284809    schedule 13.05.2014    source источник
comment
пожалуйста, должно быть KeyEvent.VK_1 && KeyEvent.CTRL_MASK ??? РЕДАКТИРОВАТЬ, если (код == KeyEvent.VK_1 && модификаторы == KeyEvent.CTRL_MASK) {   -  person mKorbel    schedule 13.05.2014
comment
должно быть так просто, используя KeyBindings вместо KeyListener   -  person mKorbel    schedule 13.05.2014
comment
Вы проверяли, работают ли только 1 или 2 (без CTRL)?   -  person Angelo Fuchs    schedule 13.05.2014
comment
Как я могу сделать с Keybindings, не очень понимаю учебник...   -  person user3284809    schedule 13.05.2014
comment
Нет, не проверял без Ctrl   -  person user3284809    schedule 13.05.2014
comment
@user3284809 1. здесь можно поискать, в т.ч. примеры рабочего кода, 2. довольно часто, два-три раза в день в ответах здесь, 3. наиболее важным является вопрос, как вы установили фокус на что-то, потому что JComponents должен быть фокусируемым для получения KeyEnvents от KeyListener   -  person mKorbel    schedule 13.05.2014
comment
Попробуйте использовать getInputMap(WHEN_IN_FOCUSED_WINDOW)   -  person MadProgrammer    schedule 13.05.2014
comment
Я поместил это в конструктор JPanel: setFocusable(true);   -  person user3284809    schedule 13.05.2014
comment
@user3284809 user3284809 Тогда, пожалуйста, проверьте это. Я предполагаю, что вы не получаете ввод с цифровой клавиатуры (по какой-либо причине) ИЛИ что вторая клавиша CTRL сломана (или отправляет неправильный код клавиши).   -  person Angelo Fuchs    schedule 13.05.2014
comment
Так что я только что проверил цифровую клавиатуру без Ctrl, это работает. Я также проверил 2-й ctrl с другими числами без цифровой клавиатуры, так что это тоже работает. Мне интересно, работает ли когда-нибудь ctrl + numpad? Даже с левым ctrl не работает цифровая клавиатура.   -  person user3284809    schedule 13.05.2014


Ответы (1)


Во-первых, я настоятельно рекомендую использовать API привязки клавиш.

Второе KeyEvent.VK_1 — это не то же самое событие, которое вызывается для цифровой клавиатуры + 1, вместо этого оно вызывается KeyEvent.VK_NUMPAD1, это другое ключевое событие, точно так же, как функциональные клавиши вызывают события KeyEvent.VK_F1 в 12.

Например...

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

        }

    }

}
person MadProgrammer    schedule 13.05.2014