Java Applet缓冲图像

时间:2010-05-25 22:55:47

标签: java applet paint repaint

好的,这是我的代码:http://www.so.pastebin.com/Qca4ERmy

我正在尝试使用缓冲区,因此applet不会在重绘()时闪烁,但似乎我遇到了麻烦。小程序仍在闪烁......

帮助?

谢谢。

我制作了一个关于此问题的快速视频:http://www.vimeo.com/12035196

3 个答案:

答案 0 :(得分:3)

创建一个Swing小程序。默认情况下,Swing是双缓冲的,因此您不应该遇到此问题。从How to Make Applets上的Swing教程中的部分开始,了解创建Swing applet的正确方法。

答案 1 :(得分:2)

您可以尝试使用BufferedImage来解决此问题,这样您只需创建一个与您的框架兼容的BufferedImage,然后在将整个图像blit到{{{ 1}}的内容。

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

答案 2 :(得分:2)

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

我无法访问我的代码,因此以下内容可能有点不合适(代码可能效率最低):

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