2010-07-25 82 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