【发布时间】:2023-03-14 19:41:02
【问题描述】:
所以我得到了两个名为 Viewer 和 PaintWindow 的类。在我的例子中,当我使用我的 PaintWindow 类在 JPanel 上绘制东西时,Viewer 类充当控制器。
现在我正在尝试制作一个小游戏,但我不明白如何实现 KeyListener 来控制游戏。我想要的是一个监听 keyEvent 发生的监听器,这样我就可以决定会发生什么。这就是我的代码的样子:
查看者:
public void run() {
System.out.println("Viewer Run");
cloud1 = new ImageIcon("src/images/cloud.png");
cloud2 = new ImageIcon("src/images/cloud.png");
background1 = new ImageIcon("src/images/background.png");
playerStill = new ImageIcon("src/images/still.png");
playerRight = new ImageIcon("src/images/right.png");
playerLeft = new ImageIcon("src/images/left.png");
paintWindow = new PaintWindow(background1);
paintWindow.showImage(playerStill, 30, 370);
paintWindow.addKeyListener(new KeyTimerListener());
paintWindow.startAlarm();
}
/*
* Lyssnar på vad som händer när man trycker en viss knapp
*/
private class KeyTimerListener implements KeyListener {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == 37){
System.out.print("Left");
}
else if (keyCode == 39){
System.out.print("Right");
}
else if (keyCode == 32 ){
System.out.print("JUMP");
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
}
这是我的 PaintWindow 类的一部分:
public void addKeyListener(KeyListener listener){
this.listener.add(listener);
}
private class AT extends Thread {
KeyEvent keyevent;
public void run() {
try {
Thread.sleep(1);
}catch(InterruptedException e) {
}
for(KeyListener al : listener) {
al.keyPressed(keyevent);//<-----------------------------
}
thread = null;
}
}
public void startAlarm() {
if(thread==null) {
thread = new AT();
thread.start();
}
}
由于我的 KeyEvent 为空,我得到一个空指针异常。当然我可以将它定义为一个特定的键,但这对我没有帮助。
我错过了什么?
【问题讨论】:
-
PaintWindow 是什么组件?
-
@Berger 你是什么意思? PaintWindow 只是一个创建框架和 JPanel 并在 Graphics 对象的帮助下在其上绘制的类。
-
自定义对象不接收任何关键事件,java.awt.Component 接收,或者您可以注册一个全局监听器,请参阅:stackoverflow.com/questions/5344823/…