Java 键侦听器不是';行不通

Java 键侦听器不是';行不通,java,swing,keylistener,Java,Swing,Keylistener,我一直在尝试创建一个java游戏,但我遇到了一个障碍,我无法让java听我的任何键,即使我只是使用print语句来测试它。据我所知,我已经正确地实现了KeyListener,并将KeyListener添加到小程序中,但它仍然无法工作 我的主要班级: import java.awt.*; import javax.swing.*; public class Container extends JApplet implements Runnable { private static fi

我一直在尝试创建一个java游戏,但我遇到了一个障碍,我无法让java听我的任何键,即使我只是使用print语句来测试它。据我所知,我已经正确地实现了KeyListener,并将KeyListener添加到小程序中,但它仍然无法工作

我的主要班级:

import java.awt.*;
import javax.swing.*;


public class Container extends JApplet implements Runnable {
    private static final long serialVersionUID = 1L;

    public static Dimension size = new Dimension(720,560); //Size of Screen

    private static final int PIXELSIZE = 2;
    public static Dimension pixel = new Dimension(size.width/PIXELSIZE,
            size.height/PIXELSIZE); // Dimesions of screen in terms of pixels


    public static final String NAME = "Game";
    public static boolean isRunning = false;
    private Image screen;

    public static Level level;
    public static MainCharacter p1;

    public Container(){
        setPreferredSize(size);
        addKeyListener(p1);
    }

    public void start(){
        new Tile();
        level = new Level();
        p1 = new MainCharacter(20,40);

        isRunning = true;
        new Thread(this).start();
    }

    public void tick(){
        p1.tick();
    }

    public void render(){
        Graphics g = screen.getGraphics();
        g.setColor(new Color(130,160,255));
        g.fillRect(0, 0, pixel.width, pixel.height);
        level.render(g);
        p1.render(g);
        g = getGraphics();
        g.drawImage(screen, 0, 0, size.width, size.height, 
                0, 0, pixel.width, pixel.height, null);
        g.dispose();
    }

    public void run() {
        screen = createVolatileImage(pixel.width,pixel.height);
        while(isRunning){
            tick();
            render();
            try{
                Thread.sleep(5);
            }catch(InterruptedException e){}    
        }
    }

    public static void main(String[] args){
        Container container = new Container();
        JFrame frame = new JFrame();
        frame.add(container);
        frame.pack();
        frame.setTitle(NAME);
        frame.setResizable(true);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        container.start();
    }

    public static void right(){
        p1.right();
    }

    public static void left(){
        p1.left();
    }

}
我的角色类:

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class MainCharacter extends Tall implements KeyListener{
public double fallSpeed = 1.5;
public double moveSpeed = 1.0;
public double xSpeed = 1;


public MainCharacter(int width, int height){
    setBounds(Container.pixel.width/2 - width/2,
            Container.pixel.height/2 - height/2,
            width, height);
}

public void tick(){
    if(Container.level.space[(int)(x+width)][(int)(y+height)] &&
            Container.level.space[(int)(x)][(int)(y+height)] &&
            Container.level.space[(int)(x+width)][(int)(y)] &&
            Container.level.space[(int)(x)][(int)(y)])
        y += fallingSpeed;
}

public void render(Graphics g){
    g.drawImage(Tile.tileset_terrain, (int)x, (int)y,
            (int)(x+width),(int)(y+height),
            Tile.CHARACTER[0]*Tile.TILE_SIZE,
            Tile.CHARACTER[1]*Tile.TILE_SIZE,
            Tile.CHARACTER[0]*Tile.TILE_SIZE +(int)width,
            Tile.CHARACTER[1]*Tile.TILE_SIZE + (int)height, null);
}

public void right(){
    x += xSpeed;
}

public void left(){
    x -= xSpeed;
}

@Override
public void keyPressed(KeyEvent e) {
    System.out.println("hey");

}

@Override
public void keyReleased(KeyEvent e) {
    System.out.println("hey");

}

@Override
public void keyTyped(KeyEvent e) {
    System.out.println("hey");
}
}

当您将其添加为KeyListener时,
p1
似乎为空

您可以在此处将其添加为KeyListener:

public Container(){
    setPreferredSize(size);
    System.out.println(p1);  // try this...
    addKeyListener(p1);
}
但在这里举例说明:

public void start(){
    new Tile();
    level = new Level();
    p1 = new MainCharacter(20,40);

    isRunning = true;
    new Thread(this).start();
}

当您将其添加为KeyListener时,
p1
似乎为空

您可以在此处将其添加为KeyListener:

public Container(){
    setPreferredSize(size);
    System.out.println(p1);  // try this...
    addKeyListener(p1);
}
但在这里举例说明:

public void start(){
    new Tile();
    level = new Level();
    p1 = new MainCharacter(20,40);

    isRunning = true;
    new Thread(this).start();
}

KeyListener
s是易变的。它们要求注册到的组件不仅具有焦点,而且具有键盘焦点


建议您改为使用

KeyListener
s是易变的。它们要求注册到的组件不仅具有焦点,而且具有键盘焦点


建议您改为使用

可能重复的可能重复的可能重复的。这是一个非常好的捕获,我将为您投掷+1!在我创建了一个新的主角色后,在开始时放入“addKeyListener(p1)”后仍然没有响应。我应该将侦听器添加到Applet还是框架中,这会有什么不同吗?@user2789116 Yo有一个foucs问题
KeyListener
仅在其注册的组件可聚焦且具有焦点时才会响应键事件。这是众所周知的
KeyListener
问题。更好的解决方案是使用,因为它在定义生成关键事件所需的焦点级别方面提供了更大的灵活性…这是一个非常好的捕获,我将为此抛出+1!在我创建了一个新的主角色后,在开始时放入“addKeyListener(p1)”后仍然没有响应。我应该将侦听器添加到Applet还是框架中,这会有什么不同吗?@user2789116 Yo有一个foucs问题
KeyListener
仅在其注册的组件可聚焦且具有焦点时才会响应键事件。这是众所周知的
KeyListener
问题。更好的解决方案是使用,因为它在定义生成关键事件所需的焦点级别时提供了更大的灵活性。。。