如何使用KeyListener在Applet中移动图像?

时间:2017-02-27 14:33:34

标签: java

我正在尝试创建一个显示两个图像的Applet,并允许用户使用左/右箭头键(或键a和d)移动其中一个图像。从好的方面来说,我知道我正确导入了图像,因为一旦我运行程序就会显示它们;但是,一旦我按下左或右键,会立即弹出错误,图像不会像我预期的那样移动。如果有人能告诉我什么是错的,并解释我需要修复的细节,这将是一个很大的帮助。提前谢谢。

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class mainClass extends Applet implements KeyListener {
Image pic1, pic2;
int x=0, y=0,move=5;

public void init(){
    setSize (1600,1200);
    pic1 = getImage(getDocumentBase(),"beach king.jpg");
    pic2 = getImage(getDocumentBase(),"eye.jpg"); 
    addKeyListener(this);
}
public void start(){

}
public void paint(Graphics g){
    //setBackground(Color.CYAN);
    try{Thread.sleep(100);} 
    catch(Exception e){}
    //going to change position of pic1
    g.drawImage(pic1, x, y, this);
    g.drawImage(pic2, 0, 0, this);
}

private boolean[] keys;

public void keyPressed(KeyEvent e) {
    keys[e.getKeyCode()] = true;
}

public void keyReleased(KeyEvent e) {
    keys[e.getKeyCode()] = false;
}
public void keyTyped(KeyEvent e) {}

public void update() {
    if(keys[KeyEvent.VK_A] || keys[KeyEvent.VK_LEFT]){
       x-=move;
    }
    if(keys[KeyEvent.VK_D] || keys[KeyEvent.VK_RIGHT]){
       x+=move;
    }
}

}

1 个答案:

答案 0 :(得分:0)

您的代码的一个问题是您永远不会初始化数组keyPressed,但由于您只是尝试更改图像的x位置,因此使用布尔数组是非常不切实际的。相反,只需按下键即可更新x值。

您的public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT) { x-=move; } else if (e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT) { x+=move; } this.repaint(); } 函数如下所示:

keyReleased

在此方法的最后一行中,您调用repaint,以便applet实际重绘图像。

然后,您可以将update方法留空,因为您不需要重置任何值。最后,删除你的sqlite3方法,因为它永远不会被调用(代码中的其他方法被调用,因为它们是在超类或接口中指定的。)