2012-07-02 22 views
3

我想要做的是練習一些鞦韆編碼。我從頭開始創建一個矩形,並在框架上給它一個x和y的位置。我一直在試圖做的是使用一個關鍵的偵聽器來更新x變量來左右移動它。如何使用Key Listener更新「x」變量?

在這裏,我創建它實現一個動作偵聽器的類:

public class Board extends JPanel implements ActionListener { 

我添加的 「x」 和 「y」 的變量:

int x, y; 
int dx; 
int HEIGHT, WIDTH; 
private final int DELAY = 50; 

接下來是一些附加功能:

public Board() { 

    setBackground(Color.BLACK); 
    setFocusable(true); 
    setDoubleBuffered(true); 
    addKeyListener(new TAdapter()); 

    x = 15; 
    y = 150; 
    dx = 5; //This is what I want to use to update the x variable if possible. 

    HEIGHT = 15; 
    WIDTH = 15; 

} 

這就是我用上述「x」和「y」變量創建廣場的地方:

public void paint(Graphics g) { 
    super.paint(g); 

    int red = 103; 
    int green = 10; 
    int blue = 100; 
    Color square = new Color(red, green, blue); 


    g.setColor(square); 
    g.fillRect(x, y, WIDTH, HEIGHT); 

    Toolkit.getDefaultToolkit().sync(); 
} 

好吧,現在我想要完成。

我創建了一個將被送入所執行的操作方法,「移動」的方法,然後我創建了一個處理的關鍵事件密鑰適配器方法:

public void move() { 
     x += dx; 
    } 

    public void actionPerformed(ActionEvent e) { 
    move(); 
    repaint(); 
} 


private class TAdapter extends KeyAdapter { 

    public void KeyPressed(KeyEvent e) { 
     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_LEFT) { 
      dx = 1; 
     } 

     if (key == KeyEvent.VK_RIGHT) { 
      dx = -1; 
     } 
    } 
} 

這裏就是我得到的截圖:

black window with small purple square in the left side

一切都體現了通過另一個類,但這一切確實是初始化各種組件的JFrame(規模,知名度等),並啓動該程序。

當我運行該程序時,我無法獲取x變量進行更新。有人可以讓我知道我需要添加什麼嗎?

謝謝。

+5

我對使用KeyListener的建議:**不要**。爲此,請使用[鍵綁定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)。本教程將解釋爲什麼這很重要,以及如何使用這些。 –

+0

謝謝,我會嘗試。 – blutuu

+0

KeyAdapter不會更新您的UI,並且不會在鍵上調用actionPerformed。您需要刷新您的用戶界面以反映更改。 –

回答

0

我認爲你的問題是你的actionPerformed方法沒有被調用,所以你的move()方法也沒有被調用。你沒有添加任何ActionListener,所以它根本不會被調用。我會在keyPressed中調用move()和repaint()像這樣

if(key == KeyEvent.VK_LEFT) { 
    dx = 1; 
    move(); 
    repaint(); 
} 

if(key == KeyEvent.VK_RIGHT) { 
    dx = -1; 
    move(); 
    repaint(); 
} 

我非常確定這會起作用。 我還想指出你的代碼中有兩件事。首先,keyPressed有一個小寫的k,不是大寫的。其次,你用按鈕的方式使用dx,如果你按下左鍵,廣場會向右移動;它會走向相反的方向。另外,就像dann.dev在他的評論中提到的那樣,至少閱讀該書的第一章。它爲您提供了有關視頻遊戲中雙緩衝,多線程的技巧,並提供了一個可以使用的良好循環。