Java 键侦听器事件未触发?

Java 键侦听器事件未触发?,java,applet,Java,Applet,我希望能够注册一个触发布尔变量的按键事件。我在我的主课上做过,但现在我试着把它放到课堂上,它似乎不起作用 这是英雄班: public class Hero extends Main { private boolean downPressed; private boolean leftPressed; private boolean rightPressed; public void init() { } public void paint(Graphics g, int x_pos, int

我希望能够注册一个触发布尔变量的按键事件。我在我的主课上做过,但现在我试着把它放到课堂上,它似乎不起作用

这是英雄班:

public class Hero extends Main {
private boolean downPressed;
private boolean leftPressed;
private boolean rightPressed;

public void init() {
}

public void paint(Graphics g, int x_pos, int y_pos) {

    if (isDownPressed() && isLeftPressed()) {
        this.sprite = hero225;
    } else if (isDownPressed() && isRightPressed()) {
        this.sprite = hero135;
    } else if (isUpPressed() && isRightPressed()) {
        this.sprite = hero45;
    } else if (isUpPressed() && isLeftPressed()) {
        this.sprite = hero315;
    } else if (isLeftPressed() == true) {
        this.sprite = hero270;
    } else if (isRightPressed() == true) {
        this.sprite = hero90;
    } else if (isUpPressed() == true) {
        this.sprite = hero;
        System.out.println("Succsess");
    } else if (isDownPressed() == true) {
        this.sprite = hero180;
    }

    // this.sprite will contain value set on last "movement"
    g.drawImage(this.sprite, x_pos, y_pos, this);
}

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        setLeftPressed(true);
        System.out.println("keyPressed");
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        setRightPressed(true);

    }
    if (e.getKeyCode() == KeyEvent.VK_UP) {
        setUpPressed(true);
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        setDownPressed(true);
    }

}

public void keyReleased(KeyEvent e) {

    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        setLeftPressed(false);
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {

        setRightPressed(false);
    }
    if (e.getKeyCode() == KeyEvent.VK_UP) {
        setUpPressed(false);

    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        setDownPressed(false);
    }
}

public void keyTyped(KeyEvent e) {

}

public void mouseClicked(MouseEvent e) {
    System.out.println("HIT!");

}

public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

public void mousePressed(MouseEvent e) {
    boolean isButtonPressed = true;

}

public void mouseReleased(MouseEvent e) {
    boolean isButtonPressed = false;

}


public void setDownPressed(boolean downPressed) {
    this.downPressed = downPressed;
}

public boolean isDownPressed() {
    return downPressed;
}

public void setLeftPressed(boolean leftPressed) {
    this.leftPressed = leftPressed;
}

public boolean isLeftPressed() {
    return leftPressed;
}

public void setRightPressed(boolean rightPressed) {
    this.rightPressed = rightPressed;
}

public boolean isRightPressed() {
    return rightPressed;
}

public void setUpPressed(boolean upPressed) {
    this.upPressed = upPressed;
}

public boolean isUpPressed() {
    return upPressed;
}
下面是调用它的level类:

public class Level extends Main {
Hero hero = new Hero();

public void paint(KeyEvent e, Graphics g, double x_pos, double x_pos2) {
    repaint();
}
这是主类中的Paint函数,它调用:

public void paint(Graphics g) {
    Level level = new Level();
    level.paint(e, g, x_pos, y_pos);

造成这种情况的问题似乎并不明显。

您应该在要侦听事件的类中实现
java.awt.event.keystener
接口,在本例中,是Hero,因此:

public class Hero extends Main implements java.awt.event.KeyListener
然后使用某种方法(可能是init或其他方法)注册事件,使用:

addKeyListener(this);
//rest of your code
或者,如果您只想侦听某些事件,可以注册适配器,而不是实现接口KeyListener:

addKeyListener(new java.awt.KeyAdapter()
{
   public void keyPressed(java.awt.KeyEvent e)
   {
       //handle just this event
   }
}
);
//rest of of your code

您应该在要侦听事件的类中实现
java.awt.event.KeyListener
接口,在本例中为Hero,因此:

public class Hero extends Main implements java.awt.event.KeyListener
然后使用某种方法(可能是init或其他方法)注册事件,使用:

addKeyListener(this);
//rest of your code
或者,如果您只想侦听某些事件,可以注册适配器,而不是实现接口KeyListener:

addKeyListener(new java.awt.KeyAdapter()
{
   public void keyPressed(java.awt.KeyEvent e)
   {
       //handle just this event
   }
}
);
//rest of of your code

听起来像是焦点问题:只有活动组件才会获得KeyEvents


有几种方法可以解决这个问题,但我发现教程很好地涵盖了这些想法。但是如果你想要一个快速而肮脏(肮脏?不确定,简单和简单对我来说还不错;对于大型项目来说只是有点臃肿)的解决方案,你可以为每个组件实现一个监听器,并将事件转发给某个处理它的通用类。

听起来像是一个焦点问题:只有活动组件才会获得KeyEvents


有几种方法可以解决这个问题,但我发现教程很好地涵盖了这些想法。但是,如果您想要一个快速而肮脏(肮脏?不确定,简单和简单对我来说还不错;对于大型项目来说只是有点臃肿)的解决方案,您可以为每个组件实现一个侦听器,并将事件转发给处理它的某个通用类。

当我执行第二步时,我会遇到这个错误:方法addEventListener(Hero)是未定义的类型,英雄设法让它在英雄类中工作(呜呜!),但它在等级类中不工作。我所做的是放置一个System.out.println(“按键”);在if(isDownPressed()&&isLeftPressed())中{。但是当我加载级别并按left时,控制台中什么也没有发生:(为什么要在不同的类中出于相同的目的侦听相同的事件,您应该检查您的设计我在执行第二步时遇到此错误:方法addEventListener(Hero)类型未定义,Hero设法使其在Hero类中工作(Woop!),但在Level类中不工作。我所做的是在if(isDownPressed()&&isLeftPressed())中放置System.out.println(“keyPressed”){。但是当我加载Level并按下left时,控制台中没有发生任何事情:(为什么要在不同的课程中出于相同的目的收听相同的事件?您应该查看您的设计+1“要触发键盘事件,组件必须具有键盘焦点。”—+1”要触发键盘事件,组件必须具有键盘焦点。”-