Используйте привязки клавиш

Я просто вхожу в пользовательский ввод с java. Первоначально я начал с KeyListener, а затем мне сказали вместо этого использовать KeyBindings. Кажется, я не могу заставить тест анимации двигаться, когда нажимаю клавишу со стрелкой вправо. Это правильный способ реализации привязок клавиш или мне нужно что-то добавить в один из этих методов? Также возможно ли поместить все методы ввода (методы, которые обрабатывают привязки клавиш) в другой класс, к которому можно получить доступ? Моя основная проблема заключается в том, что я не могу перемещать тест анимации с помощью клавиши со стрелкой вправо.

public class EC{
    Animation test = new Animation();
    public static void main(String args[])
    {
        new EC();
    }

    public EC()
    {
        JFrame window=new JFrame("EC");
        window.setPreferredSize(new Dimension(800,600));
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(test);
        window.pack();
        window.setVisible(true);
        addBindings();
    }

    public void addBindings()
    {

        Action move = new Move(1,0);
        Action stop = new Stop();
        InputMap inputMap = test.getInputMap();
        ActionMap actionMap = test.getActionMap();
        KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,Event.KEY_PRESS);
        inputMap.put(key,"MOVERIGHT");
        actionMap.put("MOVERIGHT",move);
        key = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,Event.KEY_RELEASE);
        inputMap.put(key, "STOP");
        actionMap.put("STOP", stop);
    }
    class Move extends AbstractAction 
    {
        private static final long serialVersionUID = 1L;
        int dx,dy;
        public Move(int dx,int dy)
        {
            this.dx=dx;
            this.dy=dy;
            test.startAnimation();
            test.update();
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            test.x+=dx;
            test.y+=dy;
            test.repaint();
        }
    }
    class Stop extends AbstractAction
    {
        int dx,dy;
        private static final long serialVersionUID = 1L;
        public Stop()
        {
            test.stopAnimation();
            test.update();
        }
        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            dx=0;
            dy=0;
            test.repaint();
        }

    }




}

person user1058860    schedule 26.07.2013    source источник
comment
В вашем последнем вопросе вам дали рабочий пример: stackoverflow. com/questions/17864565/. Почему бы вам не последовать примеру?   -  person camickr    schedule 26.07.2013
comment
Еще пример, пример   -  person MadProgrammer    schedule 26.07.2013


Ответы (1)


Трудно сказать наверняка, но вместо этого вы можете попробовать что-то вроде test.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).

Также KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,Event.KEY_PRESS); неверно. Второй параметр — это атрибут-модификатор, который предназначен для таких вещей, как ctrl, alt, shift и т. д.

В вашем случае правильнее было бы KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);

Если вас интересует начало действия, вызываемое при нажатии клавиши, используйте что-то вроде...

KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false);

Или, если вы хотите знать только, когда он будет выпущен, используйте что-то вроде

KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true);
person MadProgrammer    schedule 26.07.2013