2014-03-03 79 views
0

我想在點擊鼠標後重新繪製一個方形,但重新繪製方法將被渲染10次。在java swing中重新繪製一個組件

例如在正方形是在X,Y,將在鼠標點擊後重新繪製:

  • X + 1,Y + 1
  • X + 2,Y + 2
  • X + 3,Y + 3
  • ...
  • ...
  • X + 10,Y + 10

我試圖循環重繪方法10次,但結果是最終的油漆,而不是整個過程。

public MyPanel() 
{ 

    setBorder(BorderFactory.createLineBorder(Color.black)); 

    addMouseListener(new MouseAdapter() 
    { 
     public void mousePressed(MouseEvent e) 
     { 
      for(int i=0;i<10;i++) 
       moveSquare(redSquare.getX(),redSquare.getY()); 
     } 
    }); 

} 
private void moveSquare(int x, int y) 
{ 
    final int CURR_X = redSquare .getX(); 
    final int CURR_Y = redSquare.getY(); 
    final int CURR_W = redSquare.getWidth(); 
    final int CURR_H = redSquare.getHeight(); 
    final int OFFSET = 1; 

    // The square is moving, repaint background 
    // over the old square location. 
    repaint(CURR_X,CURR_Y,CURR_W+OFFSET,CURR_H+OFFSET); 

    // Update coordinates. 
    redSquare.setX(x+1); 
    redSquare.setY(y+1); 

    // Repaint the square at the new location. 
    repaint(redSquare.getX(), redSquare.getY(), 
      redSquare.getWidth()+OFFSET, 
      redSquare.getHeight()+OFFSET); 

} 
+2

你能顯示你試過的代碼嗎? – exception1

+0

也發佈您的代碼與您的問題 – Engineer

+0

我附上的代碼。 –

回答

1

致電repaint不會立即導致組件重新粉刷。它只會告訴渲染系統:「儘快重新繪製該區域」。但是渲染系統正忙於迭代您的for循環。

原因是mousePressed方法由負責重新繪製的同一個線程執行,即由Swing Event Dispatch Thread(EDT)執行。所以這個線程正在運行通過你的for循環並觸發重繪,但只有之後它已經完成了for循環它實際上能夠執行執行重繪 - 然後,只有最後一個狀態將可見。

這裏的解決方案應該是在自己的線程中執行運動。在簡單的解決方案可能看起來像這樣

public void mousePressed(MouseEvent e) 
{ 
    moveInOwnThread(); 
} 

private void moveInOwnThread() 
{ 
    Thread t = new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      move(); 
     } 
    }); 
    t.setDaemon(true); 
    t.start(); 
} 

private void move() 
{ 
    for(int i=0;i<10;i++) 
    { 
     moveSquare(redSquare.getX(),redSquare.getY()); 

     try 
     { 
      Thread.sleep(20); 
     } 
     catch (InterruptedException e) 
     { 
      Thread.currentThread().interrupt(); 
      return; 
     } 
    } 
} 

但你應該閱讀一些有關併發在搖擺:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/

+0

謝謝,它確實工作,但我不得不在循環內使用Thread.sleep來執行它x次。 –

2

如果我理解正確的話,你要點擊的地方,並有格移動那裏,但有方有某種類型的移動動漫走向新的位置。

您正在移動您的廣場並將其重新粉刷得太快,看起來好像廣場只從其初始位置移動到了新的最終位置。如果你願意,你可以設置x和y像素速度,並且在一個循環中更新方塊的位置,該方塊根據最後一次循環迭代時間與那些x和y之間的時間差速度。