Java:使用KeyListener使用不同的键移动第二个矩形

时间:2016-11-20 06:45:47

标签: java swing jlabel paint keylistener

我正在制作一个小程序,其中两个矩形围绕赛车跑道行驶。当我运行程序时,一切都按计划进行,我可以使用箭头键在轨道周围移动黑色矩形。如果我想用W,A,S,D移动红色矩形,我该怎么办?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class first extends JLabel implements ActionListener, KeyListener {

Timer t = new Timer(5, this);
double x = 0, y = 25, velx = 0, vely = 0;


public first() {
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
}

public static void main(String[] args) {
    JLabel jl = new JLabel();
    JPanel jp = new JPanel();
    JFrame f = new JFrame();
    first m = new first();

    f.add(m);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(1650,1080);
    f.setExtendedState(JFrame.MAXIMIZED_BOTH);

    //The image below is a race car track I drew in Microsoft Paint
    jl.setIcon(new ImageIcon("C:\\Users\\Jack\\Pictures\\JavaImages\\racetrack2.png"));

    f.add(jp);
    jp.add(jl);

    f.validate();
}

public void paintComponent (Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;     
    g2.setColor(Color.RED);
    g2.fill(new Rectangle2D.Double(0, 80, 90, 50));

    g2.setColor(Color.BLACK);
    g2.fill(new Rectangle2D.Double(x, y, 90, 50));
}


public void actionPerformed(ActionEvent e) {
    repaint();
    x += velx;
    y += vely;
}

public void up() {
    vely = -3.5;
    velx = 0;
}

public void down() {
    vely = 3.5;
    velx = 0;
}

public void left() {
    velx = -4.5;
    vely = 0;
}

public void right() {
    velx = 4.5;
    vely = 0;
}

/*public void upStopped() {
    velx = 0;
    vely = 0;
}

public void downStopped() {
    velx = 0;
    vely = 0;
}

public void leftStopped() {
    velx = 0;
    vely = 0;
}

public void rightStopped() {
    velx = 0;
    vely = 0;
}*/

public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    if(code == KeyEvent.VK_UP) {
        up();
    }
    if(code == KeyEvent.VK_DOWN) {
        down();
    }
    if(code == KeyEvent.VK_LEFT) {
        left();
    }
    if(code == KeyEvent.VK_RIGHT) {
        right();
    }

    if(code == KeyEvent.VK_W) {

    }
    if(code == KeyEvent.VK_S) {

    }
    if(code == KeyEvent.VK_A) {

    }
    if(code == KeyEvent.VK_D) {

    } 
}

public void keyReleased(KeyEvent e) {
    /*int code2 = e.getKeyCode();
    if(code2 == KeyEvent.VK_UP) {
        upStopped();
    }

    if(code2 == KeyEvent.VK_DOWN) {
        downStopped();
    }

    if(code2 == KeyEvent.VK_LEFT) {
        leftStopped();
    }

    if(code2 == KeyEvent.VK_RIGHT) {
        rightStopped();
    }*/
}

public void keyTyped(KeyEvent e) {}

}

1 个答案:

答案 0 :(得分:0)

  

我可以使用箭头键在轨道周围移动黑色矩形。如果我想用W,A,S,D移动红色矩形,我该怎么办?

  1. 使用Key Bindings而不是KeyListener。
  2. 您还需要使用计时器在按下某个键时启动动画,并在释放键时停止动画,因为一次只能为一个键生成事件。
  3. 查看Motion Using The Keyboard以获取有关上述概念的更多信息。 keyboardAnimation代码是实现这两个概念的完整工作示例。