2015-04-20 93 views
0

我在寫一個類來圍繞屏幕移動一個圓,但主要問題是布爾變量不會更改爲true,儘管我嘗試將它們更改爲true。我不知道我做錯了什麼。請幫忙。謝謝。布爾變量不會更改爲true

public class Restart extends Panel implements KeyListener { 

    static final int left = 37; 
    static final int right = 39; 
    static final int down = 40; 
    static final int up = 38; 

    static boolean leftPress = false; 
    static boolean rightPress = false; 
    static boolean upPress = false; 
    static boolean downPress = false; 

    static int x1 = 0; 
    static int y1 = 0; 

    Restart(int width, int length, int minusBy) { 
     super(width, length, minusBy); 
    } 

    public static void main(String args[]) throws InterruptedException { 
     Restart panel = new Restart(500, 500, 9); 
     JFrame frame = new JFrame("Fishy"); 
     frame.add(panel); 
     Frame.showFrame(frame); 

     while (true) { 

      if (upPress) { 
       y1--; 
      } 
      if (downPress) { 
       y1++; 
      } 
      if (leftPress) { 
       x1--; 
      } 
      if (rightPress) { 
       x1++; 
      } 

      Thread.sleep(1); 
      frame.repaint(); 
     } 
    } 

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

     g.fillOval(x1, y1, 50, 50); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     if (up == e.getKeyCode()) { 
      upPress = true; 
     } 
     if (down == e.getKeyCode()) { 
      downPress = true; 
     } 
     if (left == e.getKeyCode()) { 
      leftPress = true; 
     } 
     if (right == e.getKeyCode()) { 
      rightPress = true; 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 

     if (up == e.getKeyCode()) { 
      upPress = false; 
     } 
     if (down == e.getKeyCode()) { 
      downPress = false; 
     } 
     if (left == e.getKeyCode()) { 
      leftPress = false; 
     } 
     if (right == e.getKeyCode()) { 
      rightPress = false; 
     } 
    } 

    /* NOT USING */ 
    @Override 
    public void keyTyped(KeyEvent e) { 
    } 
} 
+0

使用'KeyListener'上的鍵綁定來克服'KeyListener'的所有相關問題。請參閱[如何使用關鍵綁定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer

+0

哦,除非您使用'BufferStrategy',否則我還會推薦使用AWT庫上的Swing庫... – MadProgrammer

回答

0

你永遠不會向任何組件添加keylistener。所以你不會得到任何輸入。通過調用someComponent.addKeyListener(this)將重新啓動作爲keylistener添加到某些ComponentJPanel以及其他一些可能需要使用setFocusable(true)進行調焦)。我建議你將偵聽器添加到Restart實例本身。

+0

哦。謝謝。順便說一句,我認爲,當你持有它一次,但是班級沒有睡33毫秒時,keylistener會準確地睡33毫秒?你知道爲什麼? – wolfpupxd

+0

你是什麼意思,「當你拿一次」? – Paul

+0

@wolfpupxd這是操作系統產生的常見延遲,延遲了第一次按鍵和重複按鍵之間的時間。一般來說,你應該提高一個標誌,指出當前按哪個鍵,並使用某種更新循環來處理基於哪些鍵當前被標記的邏輯 – MadProgrammer