How to use Key Bindings instead of Key Listeners

后端 未结 4 2092
渐次进展
渐次进展 2020-11-22 03:39

I\'m using KeyListeners in my code (game or otherwise) as the way for my on-screen objects to react to user key input. Here is my code:

public class MyGame e         


        
4条回答
  •  日久生厌
    2020-11-22 04:07

    Here is an example of how to get key bindings working.

    (Inside JFrame subclass using extends, which is called by the constructor)

    // Create key bindings for controls
    private void createKeyBindings(JPanel p) {
        InputMap im = p.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
        ActionMap am = p.getActionMap();
        im.put(KeyStroke.getKeyStroke("W"), MoveAction.Action.MOVE_UP);
        im.put(KeyStroke.getKeyStroke("S"), MoveAction.Action.MOVE_DOWN);
        im.put(KeyStroke.getKeyStroke("A"), MoveAction.Action.MOVE_LEFT);
        im.put(KeyStroke.getKeyStroke("D"), MoveAction.Action.MOVE_RIGHT);
        am.put(MoveAction.Action.MOVE_UP, new MoveAction(this, MoveAction.Action.MOVE_UP));
        am.put(MoveAction.Action.MOVE_DOWN, new MoveAction(this, MoveAction.Action.MOVE_DOWN));
        am.put(MoveAction.Action.MOVE_LEFT, new MoveAction(this, MoveAction.Action.MOVE_LEFT));
        am.put(MoveAction.Action.MOVE_RIGHT, new MoveAction(this, MoveAction.Action.MOVE_RIGHT));
    }
    

    Separate class to handle those key bindings created above (where Window is the class that extends from JFrame)

    // Handles the key bindings
    class MoveAction extends AbstractAction {
    
        enum Action {
            MOVE_UP, MOVE_DOWN, MOVE_LEFT, MOVE_RIGHT;
        }
    
    
        private static final long serialVersionUID = /* Some ID */;
    
        Window window;
        Action action;
    
        public MoveAction(Window window, Action action) {
            this.window = window;
            this.action = action;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            switch (action) {
            case MOVE_UP:
                /* ... */
                break;
            case MOVE_DOWN:
                /* ... */
                break;
            case MOVE_LEFT:
                /* ... */
                break;
            case MOVE_RIGHT:
                /* ... */
                break;
            }
        }
    }
    

提交回复
热议问题