Java键绑定 [英] Java Key Bindings

查看:50
本文介绍了Java键绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要为uni做一个作业,需要让用户使用方向键控制游戏.

I've got an assignment to do for uni and need to let a user control a game using the direction keys.

到目前为止,我有以下内容,但这不起作用.有什么明显的我想念的吗?

So far I've got the following, but this isn't working. Is there anything obvious that I'm missing?

    // key bindings

    // add the key bindings for up, down, left and right to the input map
    gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0), "down");
    gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0), "up");
    gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0), "left");
    gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0), "right");

    // assign actions to the key bindings in the action map
    gamePanel.getActionMap().put("down", new AbstractAction() 
    {
        public void actionPerformed(ActionEvent event)
        {
            move("DOWN");
        }
    });
    gamePanel.getActionMap().put("up", new AbstractAction() 
    {
        public void actionPerformed(ActionEvent event)
        {
            move("UP");
        }
    });
    gamePanel.getActionMap().put("left", new AbstractAction() 
    {
        public void actionPerformed(ActionEvent event)
        {
            move("LEFT");
        }
    });
    gamePanel.getActionMap().put("right", new AbstractAction() 
    {
        public void actionPerformed(ActionEvent event)
        {
            move("RIGHT");
        }
    });

按下任何方向按钮都没有任何反应.

Nothing is happening when pressing any of the directional buttons.

预先感谢您的帮助.

下面的MCVE-我已经做过的第一件事,所以让我知道它是否足够好

MCVE below- first one I've done so let me know if it's good enough or not

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

import com.sun.java.swing.plaf.windows.resources.windows;

import java.util.ArrayList;

public class MCVE extends JFrame
{
    // Game panel
    private JPanel gamePanel;

    private Container window;

    public static void main(String[] args) 
    {
        MCVE frame = new MCVE();

        frame.setSize(1000,700);

        frame.createGUI();

        frame.setLocationRelativeTo(null);

        frame.setVisible(true);
    }

    private void createGUI()
    {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        window = getContentPane();

        gamePanel = new JPanel();


        window.add(gamePanel);
    }

    private void keyBindings()
    {
        // key bindings

        // add the key bindings for up, down, left and right to the input map
        gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0), "down");
        gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0), "up");
        gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0), "left");
        gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0), "right");

        // assign actions to the key bindings in the action map
        gamePanel.getActionMap().put("down", new AbstractAction() 
        {
            public void actionPerformed(ActionEvent event)
            {
                System.out.println("down");
            }
        });
        gamePanel.getActionMap().put("up", new AbstractAction() 
        {
            public void actionPerformed(ActionEvent event)
            {
                System.out.println("up");
            }
        });
        gamePanel.getActionMap().put("left", new AbstractAction() 
        {
            public void actionPerformed(ActionEvent event)
            {
                System.out.println("left");
            }
        });
        gamePanel.getActionMap().put("right", new AbstractAction() 
        {
            public void actionPerformed(ActionEvent event)
            {
                System.out.println("right");
            }
        });
    }
}

推荐答案

您的可运行示例从不调用 keyBindings 方法,因此它们从未被注册...

Your runnable example never calls the keyBindings method, so they are never registered...

private void createGUI() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    window = getContentPane();
    gamePanel = new JPanel();
    window.add(gamePanel);
    // This is going to help...
    keyBindings();
}

在这里,调试语句和花费少量时间调试代码将对您有所帮助.当某些事情不起作用时,请务必先检查您是否已正确设置...我仍然一直在犯这种错误;)

This is where debug statements and investing a small amount of time debugging your code will help. When something doesn't work, always check that you've setup properly first...I still make this kind of mistake all the time ;)

以防万一,此示例使用 onKeyRelease 参数监视按下和释放事件,并支持数字键盘上的箭头键

And just in case, this example uses the onKeyRelease parameter to monitor press and release events as well as supports num-pad arrow keys

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
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 Test {

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

    public Test() {
        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 up;
        private JLabel down;
        private JLabel left;
        private JLabel right;

        public TestPane() {

            up = createLabel("UP");
            down = createLabel("DOWN");
            left = createLabel("LEFT");
            right = createLabel("RIGHT");

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.anchor = GridBagConstraints.CENTER;
            add(up, gbc);
            gbc.gridy = 2;
            add(down, gbc);

            gbc.gridx = 0;
            gbc.gridy = 1;
            add(left, gbc);
            gbc.gridx = 2;
            add(right, gbc);

            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "up-press", new HighlightAction(up, true));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, 0, false), "up-press", new HighlightAction(up, true));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "down-press", new HighlightAction(down, true));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, 0, false), "down-press", new HighlightAction(down, true));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "left-press", new HighlightAction(left, true));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_KP_LEFT, 0, false), "left-press", new HighlightAction(left, true));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "right-press", new HighlightAction(right, true));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_KP_RIGHT, 0, false), "right-press", new HighlightAction(right, true));

            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "up-release", new HighlightAction(up, false));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, 0, true), "up-release", new HighlightAction(up, false));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "down-release", new HighlightAction(down, false));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, 0, true), "down-release", new HighlightAction(down, false));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "left-release", new HighlightAction(left, false));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_KP_LEFT, 0, true), "left-release", new HighlightAction(left, false));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "right-release", new HighlightAction(right, false));
            registerKeyBinding(KeyStroke.getKeyStroke(KeyEvent.VK_KP_RIGHT, 0, true), "right-release", new HighlightAction(right, false));
        }

        public void registerKeyBinding(KeyStroke keyStroke, String name, Action action) {
            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = getActionMap();

            im.put(keyStroke, name);
            am.put(name, action);
        }

        public JLabel createLabel(String text) {
            JLabel label = new JLabel(text);
            label.setOpaque(true);
            label.setHorizontalAlignment(JLabel.CENTER);
            return label;
        }

        public class HighlightAction extends AbstractAction {

            private JLabel label;
            private boolean on;

            public HighlightAction(JLabel label, boolean on) {
                this.label = label;
                this.on = on;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                if (on) {
                    label.setBackground(Color.RED);
                    label.repaint();
                } else {
                    label.setBackground(null);
                }
            }

        }

    }

}

这篇关于Java键绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆