Java applet在Mac上闪烁

Rez*_*Rez 5 java swing flicker japplet

这个问题很奇怪.每个平台上都不会出现此问题.我在谷歌浏览器中使用MacOSX,但在Safari中不会出现这种情况.对于使用Windows的朋友,在Google Chrome上它可以完美运行.我还有一个使用MacOSX的朋友,对他而言,它在Chrome,Safari和Firefox上闪烁.我们都有MacOSX Lion.我没有看到任何链接.你们有人可以测试它并报告它是否发生,你的平台是什么(最多应该在30秒内发生)?


在Oracle的论坛上找到了这个帖子.显然,这是MacOSX上一个众所周知的问题,因为Java创建了一个子进程而Safari不允许将其作为安全功能.然而,问题也发生在Mac上的Chrome和Firefox中(并不像我这样在Safari上).去图......我很高兴听到有人对此发表意见.


我目前正在制作一个小型的Java Tetris游戏,我的问题是屏幕偶尔会在applet版本中闪烁(扩展JApplet).当我在计算机上的JFrame中运行它时,一切正常.

applet可以在这个网站上查看和使用:http://mtetris.herokuapp.com/(我不是试图宣传或宣传任何东西,我只是把它放在人们可以真正看到问题所在的位置).

(还有一个问题是applet没有自动加载时没有正确地获得鼠标焦点 - 即当浏览器阻止它并询问用户是否允许加载它时.如果"开始级别"数字没有正确突出显示,这就是原因.)

以下是我尝试过但没有修复闪烁问题的事情:

  • 将applet中的每个组件的applet,根窗格,内容窗格的背景设置为黑色.
  • 覆盖applet的paint()方法并在其中进行双缓冲(我在当前代码中注释了这部分,因为它没有改进任何东西)
  • 覆盖applet的update()方法并直接调用paint()它(此问题现已根据官方文档中的方法说明修复)

整个源代码可以在此页面的 github上找到.扩展JApplet的类是TetrisApplication.源代码还不是很干净,所以,对不起.


这就是我实现双缓冲的方式

public class TetrisApplication extends JApplet {

    //  the dimension of the applet
    private Dimension dimension;
    // image used for double buffering
    Image offscreen;
    // the second buffer
    Graphics bufferGraphics;

    public void init() {
        super.init();
        dimension = getSize();
        offscreen = createImage(dimension.width, dimension.height);
        bufferGraphics = offscreen.getGraphics();
        ...
    }

    public void paint(Graphics g){
        bufferGraphics.clearRect(0, 0, dimension.width, dimension.height);
        super.paint(bufferGraphics);
        g.drawImage(offscreen, 0, 0, this);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

asa*_*yer 0

要停止滑动,您需要对绘图表面进行双缓冲。您确定您第一次正确实施了吗?

也许这会有所帮助:https://gamedev.stackexchange.com/questions/18661/how-do-i-prevent-flickering-when-drawing-to-a-jpanel