以下是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)
方法吗?当我打电话给它时,我收到一个错误,指出:
无法在变量中解析
我要移动的对象是一个巨大的循环。
答案 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>