首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyListener工作,但不工作

KeyListener工作,但不工作
EN

Stack Overflow用户
提问于 2014-03-27 03:29:08
回答 1查看 680关注 0票数 1

我对键盘监听器很陌生,但最近我做了一个小程序,它将在下面,它使用键盘监听器使A,W,S,D键移动一个正方形。我用dropbox在这台笔记本电脑上安装了程序,现在它不工作了。在我看来,它在键盘上工作,但在笔记本电脑键盘上却不起作用,我觉得很奇怪。知道为什么吗?这是代码,好的一部分:

代码语言:javascript
复制
   public class Game extends JApplet implements KeyListener
{
    public boolean isMoving = false;
    int test = 0;
    Rect r = new Rect();
            public void keyPressed(KeyEvent e){}
            public void keyReleased(KeyEvent e){} // ignore
            public void keyTyped(KeyEvent e)
            {
                char keyChar = e.getKeyChar();
                if (keyChar == KeyEvent.VK_S)
                    {
                        r.yVelocity -= 1;
                    }
                if (keyChar == KeyEvent.VK_W)
                    {
                        r.yVelocity+=1;
                    }
                if (keyChar == KeyEvent.VK_A)
                    {
                        r.xVelocity -=1;
                    }
                if (keyChar == KeyEvent.VK_D)
                    {
                        r.xVelocity +=1;
                    }
            }
EN

回答 1

Stack Overflow用户

发布于 2014-03-27 03:35:13

KeyListener有焦点问题。也就是说,只有在可聚焦且有焦点的情况下,它才会对关键事件作出反应。

简单的解决方案是使KeyListener注册为焦点的组件可用并使用requestFocusInWindow,但这使得组件不会接收密钥板焦点。

一个更好的解决方案是使用键绑定 API,它允许您配置引发关键事件所需的焦点级别.

更新了一个键绑定示例/测试

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestKeyBindings {

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

    public TestKeyBindings() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new KeyPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class KeyPane extends JPanel {

        private Triangle up;
        private Triangle down;
        private Triangle left;
        private Triangle right;

        private Set<String> activeKeys;

        public KeyPane() {
            activeKeys = new HashSet<>(4);

            up = new Triangle(20);
            down = new Triangle(20);
            left = new Triangle(20);
            right = new Triangle(20);

            AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(-90), 10, 10);
            left.transform(at);
            at = AffineTransform.getRotateInstance(Math.toRadians(180), 10, 10);
            down.transform(at);
            at = AffineTransform.getRotateInstance(Math.toRadians(-270), 10, 10);
            right.transform(at);

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "upPressed");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "downPressed");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "leftPressed");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "rightPressed");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "upReleased");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "downReleased");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "leftReleased");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "rightReleased");

            ActionMap am = getActionMap();
            am.put("upPressed", new DirectionAction("up", true));
            am.put("downPressed", new DirectionAction("down", true));
            am.put("leftPressed", new DirectionAction("left", true));
            am.put("rightPressed", new DirectionAction("right", true));
            am.put("upReleased", new DirectionAction("up", false));
            am.put("downReleased", new DirectionAction("down", false));
            am.put("leftReleased", new DirectionAction("left", false));
            am.put("rightReleased", new DirectionAction("right", false));
        }

        public void addKey(String name) {
            activeKeys.add(name);
            repaint();
        }

        public void removeKey(String name) {
            activeKeys.remove(name);
            repaint();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();

            int x = (getWidth() - (up.getBounds().width * 3)) / 2;
            int y = (getHeight() - 10) / 2;

            AffineTransform at = AffineTransform.getTranslateInstance(x, y);
            if (activeKeys.contains("left")) {
                g2d.fill(left.createTransformedShape(at));
            } else {
                g2d.draw(left.createTransformedShape(at));
            }
            at = AffineTransform.getTranslateInstance(x + 40, y);
            if (activeKeys.contains("right")) {
                g2d.fill(right.createTransformedShape(at));
            } else {
                g2d.draw(right.createTransformedShape(at));
            }
            at = AffineTransform.getTranslateInstance(x + 20, y - 20);
            if (activeKeys.contains("up")) {
                g2d.fill(up.createTransformedShape(at));
            } else {
                g2d.draw(up.createTransformedShape(at));
            }
            at = AffineTransform.getTranslateInstance(x + 20, y + 20);
            if (activeKeys.contains("down")) {
                g2d.fill(down.createTransformedShape(at));
            } else {
                g2d.draw(down.createTransformedShape(at));
            }

            g2d.dispose();
        }

        public class DirectionAction extends AbstractAction {

            private String name;
            private boolean pressed;

            public DirectionAction(String name, boolean pressed) {
                this.name = name;
                this.pressed = pressed;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                if (pressed) {
                    addKey(name);
                } else {
                    removeKey(name);
                }
            }

        }
    }

    public class Triangle extends Path2D.Double {

        public Triangle(int size) {

            moveTo(size / 2, 0);
            lineTo(size, size);
            lineTo(0, size);
            closePath();

        }

    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22677699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档