java - JMenus导致JOGL GLCanvas Canvas 闪烁

标签 java opengl jogl

单击 JMenu 选项导致我的 JOGL GLCanvas 闪烁。

JMenu 将 setDefaultLightWeightPopupEnabled 设置为 false。我不想使用 JGLPanel,因为它运行速度较慢(应用程序需要以全屏模式运行)。

有趣的是,如果我在命令行上设置 sun.java2d.opengl=true,闪烁就会停止。但是,sun 默认情况下不启用此功能的事实让我担心我会冒着让用户遇到硬件不兼容问题的风险。

其他人在点击菜单时看到下面代码的闪烁吗?

我已经尝试了各种方法,例如使用 JFrame 和 Canvas 的双缓冲选项,但没有让 Canvas 不闪烁。

任何人都可以让它在查看菜单选项时不闪烁吗?

谢谢!

-丹

import javax.media.opengl.*;
import javax.swing.*;

public class FlickerTest extends JFrame {
    private GLCapabilities m_caps = new GLCapabilities();

    public FlickerTest() {
        super("FlickerTest");

        GLCanvas canvas = new GLCanvas(m_caps);
        add( canvas );
        canvas.addGLEventListener( new MyGLEventListener() );

        setSize( 640, 480 );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        // false lets the JMenuBar appear on top of the remote image openGL canvas
        JPopupMenu.setDefaultLightWeightPopupEnabled(false);

        setJMenuBar( getMyMenuBar() );
        setVisible( true );
    }

    public static void main(String[] args) {
        new FlickerTest();
    }

    private static JMenuBar getMyMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenuItem quitMenuItem = new JMenuItem( "Quit" );
        JMenuItem doSomething = new JMenuItem("Do Something");
        fileMenu.add( quitMenuItem );
        fileMenu.add( doSomething );

        menuBar.add( fileMenu );
        return menuBar;
    }

    private class MyGLEventListener implements GLEventListener {
        private MyGLEventListener() {
        }

        public void init(GLAutoDrawable drawable) {
            GL gl = drawable.getGL();
            gl.glClearColor(1,1,0,0);
            gl.glBlendFunc(GL.GL_ONE,GL.GL_ONE);
            gl.glEnable(GL.GL_BLEND);
        }

        public synchronized void display( GLAutoDrawable p_glAutoDrawable ) {
            GL gl = p_glAutoDrawable.getGL();

            gl.glClear(GL.GL_COLOR_BUFFER_BIT);

            gl.glColor3f(0,0,1);
            gl.glRectf(-.5f,-.5f,.5f,.5f);
            gl.glFlush();
        }

        public void reshape(GLAutoDrawable p_drawable, int x, int y, int w, int h) {
        }

        public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
        }
    }
}

最佳答案

这是由于 AWT 每次在 JOGL 重新绘制它之前删除 GLCanvas 造成的,可以通过将以下行插入您的 main() 方法来解决:

System.setProperty("sun.awt.noerasebackground", "true");

虽然这解决了给定的问题,但在应用程序的其他区域可能会产生副作用,例如调整窗口大小时的可见伪像。我在我所有的 JOGL 应用程序中都使用它,但没有任何问题。

关于java - JMenus导致JOGL GLCanvas Canvas 闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/414915/

相关文章:

c++ - OpenGL VC++ 初学者中的 gluProject() 设置

c++ - 打开 GL 照明问题

java - 如何从 Eclipse 导出 Java OpenGL (JOGL)?

java - 带有 null Date 参数的 Hibernate native 查询

java - 使用 install4j 打包的 org.apache.tools.tar.* 类时,如何在 Java 中处理 GNU 长文件名?

c++ - 运行时的 glsl 着色器编译问题

opengl - 如何防止 3D 模型表面出现锯齿状边缘?

java - 如何将 byte[] 正确转换为 String?

java - 在maven构建期间执行子模块中的类

java - 需要帮助将不同的纹理添加到 JOGL 中的不同对象