2014-01-17 30 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()); 
    }