Java 2D游戏KeyListener没有实现它';命运

Java 2D游戏KeyListener没有实现它';命运,java,swing,2d,keylistener,Java,Swing,2d,Keylistener,我已经决定是时候把我的编程带到下一步了:制作游戏。到目前为止,我已经能够把所有东西都编码好了,也许不得不用谷歌搜索一些我不太熟悉的东西,但我觉得它应该能工作。图形正在被绘制,所有这些都很漂亮,但是当涉及到关键听众时,这就是问题所在。我创建了一个内部类来实现键侦听器,然后将其添加到Board构造函数中。我想你只需要看一下代码,但它相当长,有点凌乱。这是我第一次这样做,所以有些东西可能是不必要的,我可能只是忘记了一些非常明显的东西 主要类别: import javax.swing.*; publi

我已经决定是时候把我的编程带到下一步了:制作游戏。到目前为止,我已经能够把所有东西都编码好了,也许不得不用谷歌搜索一些我不太熟悉的东西,但我觉得它应该能工作。图形正在被绘制,所有这些都很漂亮,但是当涉及到关键听众时,这就是问题所在。我创建了一个内部类来实现键侦听器,然后将其添加到Board构造函数中。我想你只需要看一下代码,但它相当长,有点凌乱。这是我第一次这样做,所以有些东西可能是不必要的,我可能只是忘记了一些非常明显的东西

主要类别:

import javax.swing.*;

public class Game extends JFrame{
public static void main(String[] args){
    new Game();
}
public Game(){

    add(new Board());

    setTitle("Hi mom");
    setSize(555,330);
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(3);
    setVisible(true);
}
}
董事会级别:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Board extends JPanel implements ActionListener {

Image background;
Player p;
int k;
boolean moving;

public Board() {

    setFocusable(true);

    Timer timer = new Timer(25, this);
    timer.start();

    ImageIcon img = new ImageIcon(getClass().getResource("images/map.png"));
    background = img.getImage();

    addKeyListener(new Kl());

    p = new Player();

}

public void paint(Graphics g) {
    g.drawImage(background, 0, 0, null);
    g.drawImage(p.getPlayer(), p.setX(30), p.setY(187), null);
}

public void actionPerformed(ActionEvent e) {

    if (k == 'W' && moving == true) {
        p.move(0,-5);
    }
    if (k == 'S' && moving == true) {
        p.move(0,5);
    }
    if (k == 'D' && moving == true) {
        p.move(5,0);
    }
    if (k == 'A' && moving == true) {
        p.move(-5,0);
    }

    repaint();
}

public class Kl implements KeyListener {
    public void keyPressed(KeyEvent e) {
        k = e.getKeyCode();
        moving = true;
    }

    public void keyReleased(KeyEvent e) {
        moving = false;
    }

    public void keyTyped(KeyEvent e) {
    }

}
}
球员级别:

import javax.swing.*;
import java.awt.*;
public class Player{
int x, y;
Image player;
public Player(){
    ImageIcon img = new ImageIcon(getClass().getResource("images/player.png"));
    player = img.getImage();
}
public Image getPlayer(){
    return player;
}
public void move(int x, int y){
    this.x += x;
}
public int setX(int x){
    this.x = x;
    return x;
}
public int setY(int y){
    this.y = y;
    return y;
}
}

问题是,
keylister
仅在注册到的组件可聚焦且具有键盘焦点时才会触发按键事件。仅仅调用
setfocusable
是不够的。这仅仅意味着组件“能够”接收键盘焦点,而不是它拥有它


相反,您应该使用,它具有克服此限制的方法。

问题是
KeyListener
仅当注册到的组件可聚焦且具有键盘焦点时才会触发按键事件。仅仅调用
setfocusable
是不够的。这仅仅意味着组件“能够”接收键盘焦点,而不是它拥有它


相反,您应该使用,它有办法克服此限制和其他限制。

我尝试使用键绑定,但它开始变得有点混乱,但我当然会再试一次!就我个人而言,我会从OO的角度来处理这个问题,从一个简单的“移动”操作开始,它采用两个参数来描述应该应用的x/y增量(更改)。这样,对于每个移动,您可以使用这个类,根据所需的移动传递不同的delta和/或创建单独的移动动作(即上、下、左、右),这些动作从这个基类扩展而来,但这取决于您;)我尝试使用键绑定,但它开始变得有点混乱,但我当然会再试一次!就我个人而言,我会从OO的角度来处理这个问题,从一个简单的“移动”操作开始,它采用两个参数来描述应该应用的x/y增量(更改)。这样,对于每个移动,您可以使用这个类,根据所需的移动传递不同的delta和/或创建单独的移动动作(即上、下、左、右),这些动作从这个基类扩展而来,但这取决于您;)有关创建密钥绑定的一些想法,请参阅。有关创建密钥绑定的一些想法,请参阅。