0
我正在製作一個小程序,其中兩個矩形圍繞賽車軌道行駛。當我運行程序時,一切都按計劃進行,我可以使用箭頭鍵在軌道周圍移動黑色矩形。如果我想用W,A,S,D移動紅色矩形,我該怎麼辦?Java:使用KeyListener使用不同的鍵移動第二個矩形
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) {}
}
首先取消您的W/S/A/D代碼註釋。 –
在這裏搜索Java&Swing&KeyBingings&paintComponent,JLabel不適用於KeyEvents – mKorbel
如果你有這個固定的g2.fill(new Rectangle2D.Double(0,80 ,90,50)); – gpasch