2010-07-25 38 views
0

我試圖創建一個面板上的移動線(在面板上從一個點移動到另一個線的Java)的Java 2D動畫。我希望它有可能。這是我使用的代碼。面板未顯示2D動畫

private void movingline(int length) throws InterruptedException { 
     for(int i = 0; i + length < width; i++){ 
      for(int j = 0; j + length < height; j++){ 
       eraseline(); 
       drawLine(Color.cyan, i, j, i+length, j+length); 
       erase = true; 
      } 
     } 
    } 

    private void eraseline() { 
     if(erase){ 
      fillCanvas(Color.BLUE); 
     } 
    } 

在運行代碼時,面板不顯示。

下面是繪製線條的代碼。

public void drawLine(Color c, int x1, int y1, int x2, int y2) { 
     int pix = c.getRGB(); 
     int dx = x2 - x1; 
     int dy = y2 - y1; 
     canvas.setRGB(x1, y1, pix); 
     if (dx != 0) { 
      float m = (float) dy/(float) dx; 
      float b = y1 - m*x1; 
      dx = (x2 > x1) ? 1 : -1; 
      while (x1 != x2) { 
       x1 += dx; 
       y1 = Math.round(m*x1 + b); 
       canvas.setRGB(x1, y1, pix); 
      } 
     } 
     repaint(); 
    } 

在運行代碼時,面板不會顯示移動的線條。任何幫助將非常感激。

回答

2

我認爲最大的問題是,你試圖改變GUI的外觀(我猜)是一個不是事件調度線程的線程。

解決方案是將包裹的活性(具體地,調用eraseLinedrawLine)使用SwingUtilities.invokeAndWait()Runnable並調用該Runnable。


編輯:Java的圖形組件並不真正讓你自己操作的畫布。只有組件本身會執行任何繪圖,然後纔會調用繪畫。直接在畫布上畫畫,即使你能夠實現它,也會很糟糕,因爲你會干擾組件的功能。

我沒有進入更多的解釋,而是去實施我認爲是「正確」的方式來做到這一點。

http://pastebin.com/etfmKbjj

編碼的評論在必要時,我希望它給你一些想法。欲瞭解更多背景信息,請閱讀官方教程SwingGraphics

+0

我沒有完全得到你。 moveline()函數是從類的構造函數調用的。 – razor35 2010-07-25 06:41:24

+1

存在問題:你的類的構造函數很可能被'main()'調用,而這是主線程。繪圖必須發生在事件派發線程中,當您擁有Swing(或AWT)組件時,該線程由Java內部啓動。爲了正確工作,您的繪圖應該在面板的'paint()'方法中完成。但是,你不能(或者至少不應該)直接調用'paint()'。所有你可以從外面做的是設置一些變量來控制它的工作方式。 – 2010-07-25 14:46:24

+0

用示例代碼和一些解釋更新了我的答案。 – 2010-07-25 15:43:58