java - 尝试使用 KeyListeners 和 ImageIcons 时出现错误?

标签 java swing graphics stack-overflow imageicon

我目前正在尝试为学校制作一个迷宫游戏,我很困惑为什么会出现这些错误。以下是所涉及的代码片段。此外,需要进口的所有东西都已进口。首先是 Player 类,其中包含玩家的位置,然后是他们的图像。

public class Player {
int playerX;
int playerY;
int moveSpeed = 5; //I can edit move speed here
Image character;

//getters and setters to utilize the player's location and image
public Player(){ //constructor for initial starting points
    playerX = 50;
    playerY = 50;
    ImageIcon player = new ImageIcon("E://Workspace//Maze//images//Player.jpg");
    character = player.getImage();
}

public void setPlayerX(int playerX){
    this.playerX = playerX;
}
public int getPlayerX(){
    return playerX;
}

public void setPlayerY(int playerY){
    this.playerY = playerY;
}
public int getPlayerY(){
    return playerY;
}

public void setMoveSpeed(int moveSpeed){
    this.moveSpeed = moveSpeed;
}
public int getMoveSpeed(){
    return moveSpeed;
}

public Image getPlayerImage(){
    return character;
}
}

现在是创建 JPanel 的布局类,应该是最终将玩家图像绘制到游戏中的类,也是应该允许玩家移动的类。

public class Layout extends JPanel implements ActionListener { //GUI with a      non null FlowLayout
Player p = new Player();
Maze m = new Maze();

//500 x 500 seemed like a good size for the maze game
int x = 500;
int y = 500;

public Layout(){
    setLayout(new FlowLayout());
    addKeyListener(new Move());
    setFocusable(true);
}

//for use in setting and getting the borders of the game
public void setX(int x){
    this.x = x;
}
public int getX(){
    return x;
}

public void setY(int y){
    this.y = y;
}
public int getY(){
    return y;
}

public void paintGame(Graphics g){
    super.paint(g);
    g.drawImage(p.getPlayerImage(), p.getPlayerX(), p.getPlayerY(), null);
}
@Overrride
public void actionPerformed(ActionEvent ae){
    repaint();
}
}

class Move extends Layout implements KeyListener { //Inheritance
public void keyPressed(KeyEvent press) { //for the movement in the game
    //I used both keys so that if the player woukld like to use WASD or the    arrow keys either will work
    if(press.getKeyCode() == KeyEvent.VK_W || press.getKeyCode() ==  KeyEvent.VK_UP){
        //move up
        p.setPlayerY(p.getPlayerY() - p.getMoveSpeed());
    }
    else if(press.getKeyCode() == KeyEvent.VK_S || press.getKeyCode() == KeyEvent.VK_DOWN){
        //move down
        p.setPlayerY(p.getPlayerY() + p.getMoveSpeed());
    }
    else if(press.getKeyCode() == KeyEvent.VK_A || press.getKeyCode() == KeyEvent.VK_LEFT){
        //move left
        p.setPlayerX(p.getPlayerX() - p.getMoveSpeed());
    }
    else if(press.getKeyCode() == KeyEvent.VK_D || press.getKeyCode() == KeyEvent.VK_RIGHT){
        //move right
        p.setPlayerX(p.getPlayerX() + p.getMoveSpeed());
    }
}


public void keyReleased(KeyEvent release) {
    //nothing is needed here
}

public void keyTyped(KeyEvent e) {
    //does nothing if a key is type (no need for it)
}
}

最后是 Play 类,它应该运行游戏(目前我只是试图让玩家在尚未实现 map 的情况下穿过空白区域)。

public class Play {
public static void main(String[]args) { 
    play();
}

public static void play(){
    Layout l = new Layout();
    Player p = new Player();
    Maze m = new Maze();

    l.setSize(l.getX(), l.getY()); //size can be changed in layout
    l.setVisible(true);
}
}

现在,由于某种原因,当我尝试运行它时,我遇到了很多错误。我希望尽快解决这个问题,这样我就可以开始实现我的迷宫 map 了。以下是我收到的错误:

Exception in thread "main" java.lang.StackOverflowError
at java.lang.ref.SoftReference.get(Unknown Source)
at sun.misc.SoftCache$ValueCell.strip(Unknown Source)
at sun.misc.SoftCache$ValueCell.access$300(Unknown Source)
at sun.misc.SoftCache.get(Unknown Source)
at sun.awt.SunToolkit.getImageFromHash(Unknown Source)
at sun.awt.SunToolkit.getImage(Unknown Source)
at javax.swing.ImageIcon.<init>(Unknown Source)
at javax.swing.ImageIcon.<init>(Unknown Source)
at mazeGame.Player.<init>(Player.java:16)
at mazeGame.Layout.<init>(Layout.java:11)
at mazeGame.Move.<init>(Layout.java:49)
at mazeGame.Layout.<init>(Layout.java:20)

:at mazeGame.Move.<init>(Layout.java:49) at mazeGame.Layout.<init>(Layout.java:20)在 Eclipse 停止输出错误之前,会继续运行至少 20 行。 请帮助我解决这个问题,因为我目前陷入了如何让玩家移动的困境,并且需要开始为迷宫创建 map 。很抱歉这篇文章很长,但我想发布任何可能给我带来错误的内容。

最佳答案

问题是你的构造函数中有无限递归。 Layout() 调用 addKeyListener(new Move());,并且 Move 扩展 Layout,因此 Move 的构造函数还会调用 Layout(),后者又调用 Move()

您需要重构代码以避免这种情况。一个简单的方法是使 Move 不扩展 Layout,并将玩家作为构造函数参数传递给 Move

class Move implements KeyListener {
    final Player p;
    Move(Player p) {
        this.p = p;
    }
    ...
}

布局中:

addKeyListener(new Move(p));

还可以考虑使用key bindings而不是一个关键的听众。这通常是更好的方法。

关于java - 尝试使用 KeyListeners 和 ImageIcons 时出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30027811/

相关文章:

java - SwingWorker 得到一个结果

java - panel.getVisible?

java - JFrame 不从单独的类更新图形

graphics - 如何根据高度图计算可见区域?

java - 图形的透视变换

java - 使用Android虚拟设备的编译问题

java - 关于Java重数学计算的问题

java - Facebook 图形 API : Attend to event always returns responseCode: 200, false

java - 如何使用 JBoss 服务器在 MyEclipse 中调试 Web 项目?

java - Java 9 中的 JFrame 缩放