2016-11-20 51 views
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) {} 

} 
+1

首先取消您的W/S/A/D代碼註釋。 –

+1

在這裏搜索Java&Swing&KeyBingings&paintComponent,JLabel不適用於KeyEvents – mKorbel

+1

如果你有這個固定的g2.fill(new Rectangle2D.Double(0,80 ,90,50)); – gpasch

回答

0

我可以使用箭頭鍵移動黑色矩形周圍的軌道。如果我想用W,A,S,D移動紅色矩形,我該怎麼辦?

  1. 使用Key Bindings不是KeyListener的。
  2. 您還需要使用定時器在按下按鍵時啓動動畫,並在釋放按鍵時停止動畫,因爲一次只能爲單個按鍵生成事件。

查看Motion Using The Keyboard瞭解關於上述概念的更多信息。代碼是實現這兩個概念的完整工作示例。