2014-01-17 66 views
-1

enter image description here的JPanel移動節點的位置 - 重繪沒有工作

public void paintComponent(Graphics g) { 
     g.setColor(Color.red); 
     g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight()); 
    } 

    public void keyPressed(KeyEvent e) { 
     int keyCode = e.getKeyCode(); 
     if(keyCode == KeyEvent.VK_DOWN) { 
      System.out.println("down"); 
      ball.moveY(5); 
     } 
     if(keyCode == KeyEvent.VK_UP) { 
      System.out.println("up"); 
      ball.moveY(-5); 
     } 
     if(keyCode == KeyEvent.VK_LEFT) { 
      System.out.println("left"); 
      ball.moveX(-5); 
     } 
     if(keyCode == KeyEvent.VK_RIGHT) { 
      System.out.println("right"); 
      ball.moveX(5); 
     } 
     System.out.println("X: " +ball.getX() +", Y: " +ball.getY()); 
     repaint(); 
    } 

當我按下箭頭鍵移動ball,爲什麼不repaint()方法從之前抹去球的位置?這是創造一個尾巴的事情。

感謝

+0

你應該叫'super.paintComponent方法(G)'和使用的按鍵組合在keylisteners – nachokk

回答

4

你忘記調用父類的的paintComponent。即,

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.red); 
    g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight()); 
} 

  • 說的paintComponent應該受到保護,不公開。另外,不要忘記@Override註釋。
  • Swing應用程序應避免使用KeyListeners。關鍵綁定通常是首選,因爲它們是「更高級別」的概念。
+0

@growler退房[繪畫AWT和Swing](http://www.oracle.com/technetwork/java/painting-140037.html)瞭解更多關於如何在Swing中繪畫的細節 – MadProgrammer

+0

+1好的建議,與這個問題無關,但應該使用'KeyBinding 'over'KeyListener',因爲現在他必須m讓面板可以聚焦並聚焦 – nachokk

+0

@MadProgrammer:不,不要刪除你的答案,因爲它提供了不同的信息。而我1 +'d它。 –

4

因爲你已經打破了塗料鏈。

paintComponent所做的其中一項工作就是清除之前繪製過的任何內容的Graphics

,請務必讓super.paintComponent第一

一般來說,Graphics上下文是一個共享的資源,這意味着這是一個循環的油漆塗在一切都將共享相同的Graphics上下文。這也意味着同一個Graphics上下文可能會用於單個本地對等體(如您所見)。你必須始終以清潔使用前的背景下盡最大努力(透明度是一個特例)

看看Painting in AWT and Swing關於繪畫是如何在Swing

做更多的細節已經被提出,它是建議您使用Key Bindings APIKeyListener,最顯著的原因是因爲鍵綁定API爲您提供了焦點的被觸發

0

你忘記調用super.paintComponent方法的一個關鍵事件之前所要求的水平的更大的控制權(G) 。看看PaintComponent

嘗試更換

public void paintComponent(Graphics g) { 
     g.setColor(Color.red); 
     g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight()); 
    } 

通過

public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight()); 
    }