好的,这是我的代码: http: //www.so.pastebin.com/Qca4ERmy
我正在尝试使用缓冲区,因此小程序不会在 redraw() 时闪烁,但似乎我遇到了麻烦。小程序仍然闪烁....
帮助?
谢谢你。
我制作了一个关于这个问题的快速视频:http: //www.vimeo.com/12035196
好的,这是我的代码: http: //www.so.pastebin.com/Qca4ERmy
我正在尝试使用缓冲区,因此小程序不会在 redraw() 时闪烁,但似乎我遇到了麻烦。小程序仍然闪烁....
帮助?
谢谢你。
我制作了一个关于这个问题的快速视频:http: //www.vimeo.com/12035196
创建一个 Swing 小程序。Swing 默认是双缓冲的,所以你不应该有这个问题。从 Swing 教程中关于如何制作小程序的部分开始,了解创建 Swing 小程序的正确方法。
您可以尝试使用 a 来解决此问题BufferedImage
,这样您只需创建一个BufferedImage
与您的框架兼容的 a ,然后在将整个图像blitting 到JFrame
的内容之前在那里绘制所有内容。
更好的方法是对类使用自动缓冲,您可以在此处BufferStrategy
阅读有关它的教程。
我做过的最好的方法是创建另一个与您的小程序相同大小的图像,绘制到该图像,然后在您的绘制/更新方法中将该图像的内容复制到您的图形对象。您必须确保在绘制到小程序时没有更新其他图像,否则会导致闪烁。绘图可能也应该在另一个线程中完成,只是为了让事情更容易理解。
我无权访问我的代码,因此以下内容可能有点偏离(并且代码可能不是最有效的):
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;
}
}
}
}
}
希望这可以帮助!
-担