Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java KeyListener可以工作,但不能';T_Java_Swing_Keyboard_Keylistener_Japplet - Fatal编程技术网

Java KeyListener可以工作,但不能';T

Java KeyListener可以工作,但不能';T,java,swing,keyboard,keylistener,japplet,Java,Swing,Keyboard,Keylistener,Japplet,我对keylistener还不熟悉,但最近我制作了一个小程序,它将在下面介绍,它使用keylistener使a、W、S、D键移动一个正方形。嗯,我用dropbox在这台笔记本电脑上获取程序,现在它不工作了。它在键盘上工作,但在笔记本电脑键盘上却不工作,这对我来说似乎很奇怪。你知道为什么吗?以下是代码,以及一部分: public class Game extends JApplet implements KeyListener { public boolean isMoving =

我对keylistener还不熟悉,但最近我制作了一个小程序,它将在下面介绍,它使用keylistener使a、W、S、D键移动一个正方形。嗯,我用dropbox在这台笔记本电脑上获取程序,现在它不工作了。它在键盘上工作,但在笔记本电脑键盘上却不工作,这对我来说似乎很奇怪。你知道为什么吗?以下是代码,以及一部分:

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

KeyListener
有焦点问题。也就是说,它只会在可聚焦且具有焦点时响应关键事件

简单的解决方案是使注册了
KeyListener
的组件可调焦,并使用
requestFocusInWindow
,但这并不意味着该组件将接收键盘调焦

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

使用密钥绑定示例/测试更新

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

        }

    }

}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入java.awt.geom.AffineTransform;
导入java.awt.geom.Path2D;
导入java.util.ArrayList;
导入java.util.HashSet;
导入java.util.Set;
导入javax.swing.AbstractAction;
导入javax.swing.ActionMap;
导入javax.swing.InputMap;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.KeyStroke;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestKeyBindings{
公共静态void main(字符串[]args){
新的TestKeyBindings();
}
公共TestKeyBindings(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newkeypane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类键窗格扩展了JPanel{
私人三角上升;
私人三角下降;
私人三角左;
私人三角权;
私钥;
公钥窗格(){
activeKeys=新哈希集(4);
向上=新三角形(20);
向下=新三角形(20);
左=新三角形(20);
右=新三角形(20);
仿射变换at=AffineTransform.getRotateInstance(数学toRadians(-90),10,10);
左。变换(at);
at=AffineTransform.getRotateInstance(数学toRadians(180),10,10);
向下转换(at);
at=AffineTransform.getRotateInstance(数学toRadians(-270),10,10);
对。转换(at);
InputMap im=getInputMap(在聚焦窗口中时);
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),“rightspressed”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0,true),“upReleased”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0,true),“downleased”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0,true),“leftReleased”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0,true),“righreleased”);
ActionMap am=getActionMap();
am.put(“向上”,新方向动作(“向上”,正确));
am.put(“向下压”,新方向动作(“向下”,正确));
am.put(“左压”,新方向动作(“左”,真));
am.put(“右压”,新方向动作(“右”,真));
am.put(“上调”,新方向动作(“上调”,虚假));
am.put(“向下释放”,新方向动作(“向下”,错误));
am.put(“leftReleased”,新方向动作(“left”,false));
am.put(右释放),新指令动作(右,假);
}
public void addKey(字符串名称){
activeKeys.add(名称);
重新油漆();
}
public void removeKey(字符串名称){
activeKeys.remove(名称);
重新油漆();
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
intx=(getWidth()-(up.getBounds().width*3))/2;
int y=(getHeight()-10)/2;
AffineTransform at=AffineTransform.getTranslateInstance(x,y);
if(activeKeys.contains(“左”)){
g2d.fill(左.createTransformedShape(at));
}否则{
g2d.draw(左.createTransformedShape(at));
}
at=AffineTransform.getTranslateInstance(x+40,y);
if(activeKeys.contains(“right”)){
g2d.fill(right.createTransformedShape(at));
}否则{
g2d.draw(right.createTransformedShape(at));
}
at=AffineTransform.getTranslateInstance(x+20,y-20);
if(activeKeys.contains(“up”)){
g2d.fill(up.createTransformedShape(at));
}否则{
g2d.绘制(up.createTr)