簡體   English   中英

如何在java中正確使用keylistener

[英]How to properly use keylistener in java

我試圖使用KeyListner使用左右鍵向前和向后移動此游戲中的角色,但我似乎無法移動角色。 我沒有運氣地看着這些答案:

如何在Java中正確使用keyListener以及如何在java中使用KeyListener?

這是我的代碼:

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)
    {
    }
}

誰能告訴我在哪里以及我在這里做錯了什么?

問題

當你這樣做

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抽象類中編寫的代碼。

解決方案

您的Design類不必是abstract因為它沒有未實現的方法。 所以我可以看到兩種方法來使用你在Design類中編寫的代碼:

第一種方式

刪除abstract關鍵字,以便您可以像使用new關鍵字的普通類一樣實例化Design類。 所以以這種方式聲明Design類:

class Design extends JPanel implements ActionListener, KeyListener

然后以這種方式實例化A2:

Design A2 = new Design();

第二種方式

如果由於某種原因,您需要該類是抽象的,那么以這種方式實例化您的A2對象:

Design A2 = new Design() {};

這將起作用,而不會覆蓋您在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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM