2010-05-25 77 views

回答

2

我做过的最好的方法是创建与您的小程序大小相同的另一个图像,然后在绘图/更新方法中将该图像的内容复制到您的图形对象。您必须确保在绘制到小程序时不会更新其他图像,否则会导致闪烁。绘图应该可能在另一个线程中完成,只是为了使事情变得更容易理解。

我没有访问我的代码,所以下面可能有点过(并且代码可能不是最有效的):

public class MyApplet extends Applet { 

    Image offscreen; 
    boolean pageFlipped = false; 
    Thread drawingThread; 

    public void init() { 
     offscreen = createImage(this.getWidth(), this.getHeight()); 
     drawingThread = new Thread(new DrawingLoop()); 
     drawingThread.start(); 
    } 

    public void update(Graphics g) { 
     paint(g); 
    } 
    public void paint(Graphics g) { 
     if (!pageFlipped) { 
      g.drawImage(offscreen, 0, 0); 
      pageFlipped = true; 
     } 
    } 

    class DrawingLoop implements Runnable { 
     public void run() { 
      while (true) { 
       Graphics g = offscreen.getGraphics(); 
       if (pageFlipped) { 
        // do your graphics code here 
        pageFlipped = false; 
       } 
      } 
     } 
    } 
} 

希望这有助于!

-Dan

2

您可以尝试使用BufferedImage来解决这个问题,这样你只需创建一个BufferedImage与您的帧兼容然后块传输之前画样样有整个图像放到JFrame的内容上。

更好的方法是使用BufferStrategy类的自动缓冲,您可以阅读关于它的教程here

+0

我尝试添加createBufferStragtegy ..但我得到的是: C:\用户\丹\文档\ DanJavaGen \ tileGen.java:39:找不到符号 符号:方法createBufferStrategy(INT) location:class tileGen createBufferStrategy(2); 我有正确的进口... – nn2 2010-05-26 01:15:47

3

创建一个Swing小程序。 Swing默认是双缓冲,所以你不应该有这个问题。从Swift教程How to Make Applets中的部分开始,了解创建Swing小程序的正确方法。

+0

不正确。我只是把我的applet变成了一个JApplet,它仍然可以做到。 – nn2 2010-05-26 02:48:02

+0

那么,你有一个编码问题的地方。例如,为什么每次绘制屏幕时都要读取文件? – camickr 2010-05-26 03:40:04