1

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

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

帮助?

谢谢你。

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

4

3 回答 3

3

创建一个 Swing 小程序。Swing 默认是双缓冲的,所以你不应该有这个问题。从 Swing 教程中关于如何制作小程序的部分开始,了解创建 Swing 小程序的正确方法。

于 2010-05-26T00:26:38.857 回答
2

您可以尝试使用 a 来解决此问题BufferedImage,这样您只需创建一个BufferedImage与您的框架兼容的 a ,然后在将整个图像blitting 到JFrame的内容之前在那里绘制所有内容。

更好的方法是对类使用自动缓冲,您可以在此处BufferStrategy阅读有关它的教程。

于 2010-05-26T00:14:06.073 回答
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;
                }
            }
        }
    }
}

希望这可以帮助!

-担

于 2010-06-01T12:37:09.227 回答