Java 在使用KeyEvent时遇到问题

Java 在使用KeyEvent时遇到问题,java,keyevent,gridworld,Java,Keyevent,Gridworld,我的问题是,如何让我的move()方法使用KeyEvents即KeyEvent.VK_DOWN? 我目前正在尝试使用import java.awt.event.KeyEvent其中我将使用箭头键而不是numpad键在二维网格中移动玩家。我有我的动作moveUp()moveRight()moveDown()和moveLeft()在我的超级类User中,类Player扩展User并包含关键事件方法。当我使用箭头键时,参与者不会移动,但是当我在网格中手动单击参与者并选择一个方法时,它会移动。因此,我的

我的问题是,如何让我的
move()
方法使用
KeyEvents
KeyEvent.VK_DOWN
? 我目前正在尝试使用
import java.awt.event.KeyEvent其中我将使用箭头键而不是numpad键在二维网格中移动玩家。我有我的动作
moveUp()
moveRight()
moveDown()
moveLeft()在我的超级类
User
中,类
Player扩展User
并包含关键事件方法。当我使用箭头键时,参与者不会移动,但是当我在网格中手动单击参与者并选择一个方法时,它会移动。因此,我的移动方法可以工作,所以我假设我的KeyEvent设置被破坏。提供了显示我手动控制这些方法的图片

包含移动方法的用户

package info.gridworld.actor;
import info.gridworld.grid.Grid;
import info.gridworld.grid.Location;

public class User extends Actor {
    private boolean isStopped = false;

    public User()
    {
        setColor(null);
    }

    public void moveUp(){
        moveTo(getLocation().getAdjacentLocation(Location.NORTH));
    }

    public void moveDown(){
        moveTo(getLocation().getAdjacentLocation(Location.SOUTH));
    }

    public void moveLeft(){
        moveTo(getLocation().getAdjacentLocation(Location.WEST));
    }

    public void moveRight(){
        moveTo(getLocation().getAdjacentLocation(Location.EAST));
    }
}  
Player类包含关键事件

package game.classes;
import info.gridworld.actor.User;
import java.awt.event.KeyEvent;


public class Player extends User{

    public Player(){
    }

    public void keyPressed(KeyEvent e){
        int keys = e.getKeyCode();
        if((keys == KeyEvent.VK_UP)){
            moveUp();
        }
        else if((keys == KeyEvent.VK_DOWN)){
            moveDown();
        }
        else if((keys == KeyEvent.VK_LEFT)){
            moveLeft();
        }
        else if((keys == KeyEvent.VK_RIGHT)){
            moveRight();
        }
    }


}  
主类

package game.classes;
import info.gridworld.grid.*;

public class PlayerRunner{


    private static GameGrid world = new GameGrid();

    public static void main(String[] args)
    {
        Player player = new Player();
        world.add(new Location(0, 0), player);
        world.show();
  }
}  


您正在扩展Actor,它与GUI无关,而KeyEvents和相关的是swing。实际上,您需要向JPanel添加一个KeyListener。据我所知,现在在Actor类中只有额外的方法

GUI实际上不在AP测试中,因此没有太多内容,但看起来您可以扩展info.gridworld.GUI.GridPanel。因此,将构造函数重写为:

public GridPanel(DisplayMap map, ResourceBundle res)
{
    super(map, res);
    addKeyListener(new KeyListener()
    {
        // Put the KeyListener methods here. 
        // (All of them: KeyListener is an interface
    }
}
这有点粗糙,但我认为应该行得通


我假设您将有一个对Actor的引用,您可以使用箭头键移动它,因此您可以调用它的move方法。

世界类实际上有一个keyPressed()方法。您只需扩展World并重写此方法即可。它将为您提供一个要使用的字符串参数,而不是KeyEvent。使用javax.swing.KeyStroke.getKeyStroke(description).getKeyCode()确定按下了哪个键。世界级的源代码是:aster/framework/info/gridworld/World/World.java


至于访问参与者的方法,我会引用世界级的参与者。然后,当您添加要移动到世界的演员时,您可以将其设置在那里。然后,在处理击键时,您可以访问要操纵的参与者

我不认为它是这样工作的,难道
World
没有收到关键信息吗?我建议使用keyBinding作为this@MadProgrammer我将尝试这个例子,我也没有在ActorWorld中看到keyPressed方法class@Rod_Algonquin我也这么认为,但OP使用的是
gridworld
API,它的工作原理稍有不同……并不是说这不可能,但如果我们能找到与API一起工作的东西,它将产生更好的结果,如果失败……hack,hack,hack;)@用户3709396超级(地图、资源);不符合JPanel方法中的参数,需要我删除map和res………`构造函数JPanel(DisplayMap,ResourceBundle)未定义删除参数以匹配“JPanel()”`我将把move()方法放在哪里?它们无法从gridPanel访问,而将它们移动到grid panel也不起作用,因为我无法访问location Getters您是在扩展gridPanel还是JPanel?整个问题是我不明白您在做什么,您是在修改gridPanel中的构造函数,还是说创建一个单独的类来完成所有这些工作?把它放在player类和user类中?我可以创建所有的KeyEvents等等,我只是不知道该在哪里添加它才能正常工作?抱歉,但我刚刚意识到这是一种糟糕的方式。发布了一个更好的答案…好的,应该可以,但是位置参数的原因是什么?那是演员的位置吗?(getLocation();)?另外,我相信您的一个链接已断开,我无法编辑以前的评论,这就是我创建此新评论的原因。我认为是在World gui中选择的演员。你不应该因为你在做什么而需要它