从外部Jar向JFrame添加KeyEventListeners



我在这里有一个类项目,我必须制作一个可以工作的小行星游戏。现在,我一直在努力让关键事件得到认可。我已经阅读和观看了教程,并让它们发挥了作用,但在这种环境中实现同样的东西并没有帮助。我希望也许有人能指引我朝着正确的方向前进。

这是用键操作方法实现KeyListener的主类,它生成了我的Ship对象并设置了一个"沙箱"。"沙盒"是显示对象的Jframe。"Sandbox"是从我在课堂上收到的一个外部jar中导入的,也是从"blobfx.jar"中导入的

package Asteroid;
import java.util.Random;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import blobfx.SandBox;
import blobfx.SandBoxMode;

public class AsteroidMain implements KeyListener{
//           ^^^^^^^^^^^^ currently has error: "The type AsteroidMain must implement the inherited abstract method KeyListener.keyPressed(KeyEvent)"
private static Random random = new Random();
public static void main(String[] args) {

    SandBox sb = new SandBox();
    sb.setFrameRate(66);
    // makes window for objects at frame rate of 15

    Ship shipThing = new Ship();
    sb.addBlob( shipThing );
    // makes ship object then adds it to the window
    SandBox.simulate(sb);
    // draws the objects on screen
}
@Override
public void keyPressed(KeyEvent e, Ship shipThing) {
//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ currently has error: "The method keyPressed(KeyEvent, Ship) of type AsteroidMain must override or implement a supertype method"
    if(e.getKeyCode() == 38){
        shipThing.moveForward(); 
        System.out.println("KEY PRESSED");
    }
}
@Override
public void keyReleased(KeyEvent e) {
}

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

这是我的船类,当按下UP键时,我想继续前进。

package Asteroid;
import java.lang.Math;
import blobfx.PolyBlob;

public class Ship extends PolyBlob{
private double angle = 0.0;
private final double delta = 0.15;
private final double speed = 5.0;

public Ship( ){
    super(0,0,0);
    int x[] = {10, -10, -5, -10};
    int y[] = { 0,  -7,  0,   7};
    setPolygon( x, y );
    // sets vertices that draws the ship polygon
    setLoc( 200, 200 );
}
public void moveForward(){
    System.out.println( "MOVING FORWARD");
    setLoc( getLoc().x + (int) Math.round(speed * Math.cos(angle)), 
            getLoc().y + (int) Math.round(speed * Math.sin(angle))
            );
}
public void turnLeft(){
}
public void turnRight(){
}

}

首先看一下KeyListener 的JavaDocs

您未实施keyPressed(KeyEvent) 违反了接口的合同要求

这个。。。

@Override
public void keyPressed(KeyEvent e, Ship shipThing) {

应该给你一个编译器错误,告诉你你没有重写一个方法,它应该是

@Override
public void keyPressed(KeyEvent e) {

你不能仅仅"发明"参数,接口描述了任何实现都必须满足的预期需求

话虽如此,我强烈反对使用KeyListener来支持密钥绑定API,请参阅如何使用密钥绑定了解更多详细信息

最新更新