代码之家  ›  专栏  ›  技术社区  ›  Muhammad Sarib

如何在java中正确使用keylistener

  •  3
  • Muhammad Sarib  · 技术社区  · 7 年前

    我正在尝试使用左右键前后移动游戏中的角色 KeyListner 但我似乎无法移动角色一点。我很不走运地看着这些答案:

    How to use keyListener properly in Java How do i use KeyListener in java?

    这是我的代码:

    package test2;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    public class Test
    {
        public static void main(String[] args)
        {
            Frame A1 = new Frame();
        }
    
    }
    
    class Frame
    {
        JFrame window;
    
        public Frame ()
        {
            awt();
        }
    
        public void awt()
        {
            Design A2 = new Design()
            {
                @Override
                public void keyTyped(KeyEvent e)
                {
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
    
                @Override
                public void keyPressed(KeyEvent e)
                {
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
    
                @Override
                public void keyReleased(KeyEvent e)
                {
                    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                }
            };
    
            window = new JFrame("Kyo's test");
    
            window.setVisible(true);
            window.setSize(1280, 786);
            window.add(A2);
    
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    
    
    abstract class Design extends JPanel implements ActionListener, KeyListener
    {
        // Timer objects for character and saws
        Timer movementOfCharacter = new Timer(5, this);
        Timer movementOfSaw = new Timer(15, this);
    
        // Variables for movement
        int xAxisOfCharacter = 50, velocityOfCharacter=2, yAxisOfSaw = 0, velocityOfSaw = 10;
    
        private Image tree, background, character, saw;
    
    
        // Constructor
        Design()
        {
            movementOfCharacter.start();
    
            addKeyListener(this);
    
            setFocusable(true);
            setFocusTraversalKeysEnabled(false);
        }
    
        // Constructor of Graphics
        protected void paintComponent(Graphics graphics)
        {
            super.paintComponent(graphics);
    
            Graphics2D graphics2d = (Graphics2D) graphics;
    
            graphics2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    
            movementOfSaw.start();
    
            // Body for background
            {
                ImageIcon whale = new ImageIcon(this.getClass().getResource("whale.jpg"));
                background = whale.getImage();
    
                graphics2d.drawImage(background, 0, 0, getWidth(), getHeight(), this);
            }
    
            // Body for trees
            {
                ImageIcon environment = new ImageIcon(this.getClass().getResource("Tree_Alt.png"));
                tree = environment.getImage();
    
                graphics2d.drawImage(tree, getWidth()/8, getHeight()-217, this);
                graphics2d.drawImage(tree, (getWidth()/5)*2, getHeight()-217, this);
                graphics2d.drawImage(tree, (getWidth()/6)*4, getHeight()-217, this);
            }
    
            // Body for Saws of death
            {
                ImageIcon sawOfDeath = new ImageIcon(this.getClass().getResource("saw.gif"));
                saw = sawOfDeath.getImage();
    
                // First saw
                {
                    graphics2d.drawImage(saw, (getWidth()/11), yAxisOfSaw, 100, 100, this);
                }
    
                // Second saw
                {
                    graphics2d.drawImage(saw, (getWidth()/7)*2, yAxisOfSaw, 100, 100, this);
                }
    
                // Thirf saw
                {
                    graphics2d.drawImage(saw, (getWidth()/2)-10, yAxisOfSaw, 100, 100, this);
                }
    
                // Fourth saw
                {
                    graphics2d.drawImage(saw, (getWidth()/6)*4, yAxisOfSaw, 100, 100, this);
                }
    
                // Fifth saw
                {
                    graphics2d.drawImage(saw, (getWidth()/6)*5, yAxisOfSaw, 100, 100, this);
                }
            }
    
            // Body for exit
            {
                graphics.setColor(Color.red);
                graphics.fillRect(getWidth()-5, getHeight()-150, 5, 150);
            }
    
            // Body for Character
            {
                ImageIcon blanka = new ImageIcon(this.getClass().getResource("Blank.gif"));
                character = blanka.getImage();
    
                graphics2d.drawImage(character, xAxisOfCharacter, getHeight()-150, 150, 155, this);
            }
        }
    
        public void actionPerformed(ActionEvent e)
        {
            yAxisOfSaw += velocityOfSaw;
    
            if(yAxisOfSaw > 0 || yAxisOfSaw < getHeight()-100)
                velocityOfSaw = -velocityOfSaw;
    
            repaint();
        }
    
        public void keyPressed(KeyEvent e)
        {
            int key = e.getKeyCode();
    
            if(key == KeyEvent.VK_LEFT)
            {
                velocityOfCharacter = -5;
            }
            if(key == KeyEvent.VK_RIGHT)
            {
                velocityOfCharacter = 5;
            }
        }
    
        public void keyTyped(KeyEvent e)
        {
        }
    
        public void keyReleased(KeyEvent e)
        {
        }
    }
    

    谁能告诉我我在哪里做错了什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bentaye    7 年前

    问题

    当你这样做的时候

    Design A2 = new Design() {
        @Override
        public void keyTyped(KeyEvent e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    
        @Override
         public void keyPressed(KeyEvent e) {
             throw new UnsupportedOperationException("Not supported yet."); 
        }
    
        @Override
        public void keyReleased(KeyEvent e) {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };
    

    您正在覆盖在中编写的代码 Design 只引发异常的抽象类。

    解决方案

    你的 设计 类不必是 abstract 因为它没有未实现的方法。因此,我可以看到使用您在中编写的代码的两种方法 设计 类别:

    第一条路

    删除 摘要 关键字,以便您可以实例化 设计 像普通类一样使用 new 关键字。因此,请声明 设计 按以下方式分类:

    class Design extends JPanel implements ActionListener, KeyListener
    

    然后以这种方式实例化A2:

    Design A2 = new Design();
    

    第二种方式

    如果出于某种原因,您需要抽象类,则需要通过以下方式实例化A2对象:

    Design A2 = new Design() {};
    

    这将起作用,并且不会覆盖您在 设计 班但这没有什么意义,上面的第一种方法更有意义。

    注释

    附注1

    现在,如果在 Design.keyPressed 您可以看到它被调用(您将在控制台中看到日志):

    public void keyPressed(KeyEvent e) {
        System.out.println("KeyEvent: "+e);
        int key = e.getKeyCode();
        ...
    

    附注2

    同时查看 keyPressed 方法,我认为还需要更新角色的X轴坐标,因此在if语句后添加此行:

    xAxisOfCharacter += velocityOfCharacter;
    

    应该是这样的:

    public void keyPressed(KeyEvent e) {
        System.out.println("KeyEvent: "+e);
        int key = e.getKeyCode();
    
        if(key == KeyEvent.VK_LEFT) {
            velocityOfCharacter = -5;
        }
        else if(key == KeyEvent.VK_RIGHT) {
            velocityOfCharacter = 5;
        }
        xAxisOfCharacter += velocityOfCharacter;
    }