KeyListener - 我需要在main中调用keyPressed方法吗?

时间:2015-05-03 08:07:26

标签: java swing awt keylistener

以下是keyPressed内的内容:

public class Movie extends JFrame implements KeyListener {

public static Sprite star1 = new Sprite("Assets/star1.png");
public static Sprite star2 = new Sprite("Assets/star2.png");
public static Sprite star3 = new Sprite("Assets/star3.png");

public void init(){
    this.addKeyListener(this);
}
@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

}
@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}
public void keyPressed(KeyEvent e) {

    System.out.println("KEY PRESSED: " + e.getKeyChar());
    animation window = new animation(500, 450); //length , height

    if (e.getKeyCode() == KeyEvent.VK_DOWN)
    {
        setFocusable(true);
        Movie.star1.setPosition( Movie.star1.getXposition() -100, 0);
        window.frameFinished();
    }
    else if  (e.getKeyCode() == KeyEvent.VK_UP)
    {
        setFocusable(true);
        Movie.star1.setPosition( Movie.star1.getXposition() +100, 0);
        window.repaint();
    }

}

按下箭头键时,我的对象不会移动。

我想知道的是 - 这是因为我需要在我的主电话中调用keyPressed(KeyEvent e)方法吗?当我打电话给它时,我收到一个错误,指出:

  

无法在变量中解析

我要移动的对象是一个巨大的循环。

1 个答案:

答案 0 :(得分:4)

如果您从未将键侦听器添加到某些Swing组件,那么它将永远不会接收事件。

static void MyAudioQueueAudioInputCallback(void * inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp * inStartTime, UInt32 inNumberPacketDescriptions, const AudioStreamPacketDescription * inPacketDescs) { void(^block)(AudioQueueBufferRef) = (__bridge void(^)(AudioQueueBufferRef))inUserData; block(inBuffer); } static void MyAudioQueueAudioOutputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer) { void(^block)(AudioQueueBufferRef) = (__bridge void(^)(AudioQueueBufferRef))inUserData; block(inBuffer); } OSStatus MyAudioQueueConfigureInputQueueAndCallback(AudioStreamBasicDescription inFormat, AudioQueueRef *inAQ, void(^callback)(AudioQueueBufferRef)) { return AudioQueueNewInput(&inFormat, MyAudioQueueAudioInputCallback, (__bridge_retained void *)([callback copy]), nil, nil, 0, inAQ); } OSStatus MyAudioQueueConfigureOutputQueueAndCallback(AudioStreamBasicDescription inFormat, AudioQueueRef *inAQ, void(^callback)(AudioQueueBufferRef)) { return AudioQueueNewOutput(&inFormat, MyAudioQueueAudioOutputCallback, (__bridge_retained void *)([callback copy]), nil, nil, 0, inAQ); } 本身并不神奇,不会听按键。你使用KeyListener做的是:当你按下某个键时,你会告诉其他一些Swing组件(如窗口或文本框)来调用你的KeyListener。该组件是寻找按键的东西,而不是听众。

在您的情况下,看起来您打算使用KeyListener将关键监听器添加到窗口(因为在您的情况下this.addKeyListener(this);同时是this和{{1 }})。

但是,如果没有调用你的KeyListener方法,那么JFrame方法中的代码(就像任何方法一样)永远不会运行,因此关键监听器不会被添加到窗口中,所以按下某个键时,窗口不会调用它!

一种可能的解决方案是确保在创建新init后调用init(您没有显示发生这种情况的代码)。

另一个解决方案是使用构造函数,而不是像这样的方法:

init

- 构造函数在创建对象时运行,这样,只要创建Movie对象,就会调用public Movie() { this.addKeyListener(this); } ,而创建者不必记住调用addKeyListener。< / p>