Surface already locked?

What does the following error mean?


Exception in thread “AWT-EventQueue-0” net.java.games.jogl.GLException: Surface
already locked
at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.lockSurface
(WindowsOnscreenGLContext.java:165)
at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.makeCurrent
(WindowsOnscreenGLContext.java:126)
at net.java.games.jogl.impl.GLContext.invokeGL(GLContext.java:246)
at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.invokeGL(Wi
ndowsOnscreenGLContext.java:79)
at net.java.games.jogl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas
.java:236)
at net.java.games.jogl.GLCanvas.display(GLCanvas.java:77)
at gov.nasa.jsc.renderer.Renderer.clearScreen(Renderer.java:924)
at gov.nasa.jsc.renderer.Renderer.init(Renderer.java:139)
at net.java.games.jogl.impl.GLDrawableHelper.init(GLDrawableHelper.java:
68)
at net.java.games.jogl.GLCanvas$InitAction.run(GLCanvas.java:242)
at net.java.games.jogl.impl.windows.WindowsGLContext.makeCurrent(Windows
GLContext.java:171)
at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.makeCurrent
(WindowsOnscreenGLContext.java:129)
at net.java.games.jogl.impl.GLContext.invokeGL(GLContext.java:246)
at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.invokeGL(Wi
ndowsOnscreenGLContext.java:76)
at net.java.games.jogl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas
.java:236)
at net.java.games.jogl.GLCanvas.reshape(GLCanvas.java:133)
at java.awt.Component.setBounds(Unknown Source)
at java.awt.BorderLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)


I get that error when I invoke the clearScreen() method as is below. I have the gldrawable as a class member so that I can access it and make calls from outside this class when I click buttons to clear my screen.


public class MyRenderer implements GLEventListener, MouseListener, MouseMotionListener, KeyListener
{
   private GLDrawable gldrawable = null;

   public void init(GLDrawable drawable) {
      GL gl = drawable.getGL();
      GLU glu = drawable.getGLU();
      this.gldrawable = drawable;
      ...
   }

   public void display(GLDrawable drawable) {
      GL gl = drawable.getGL();
      GLU glu = drawable.getGLU();
      this.gldrawable = drawable;
      ...
   }

   // I have a button that calls this to clear the screen.
   public void clearScreen() {
      //GL gl =  gldrawable.getGL();

      gldrawable.getGL().glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
      gldrawable.getGL().glClear(GL.GL_COLOR_BUFFER_BIT |                   GL.GL_DEPTH_BUFFER_BIT);

      // tried this, got no exceptions, but didn't clear the screen. 
      //gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
      //gl.glClearDepth(1.0);
      //gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
      //gl.glMatrixMode(GL.GL_MODELVIEW);
      //gl.glLoadIdentity();
    
      this.gldrawable.display();

      return;
   }
}

You can only call OpenGL routines while your GLEventListener’s callback methods are active on the stack. Put your call to clearScreen() into your display() callback and it will work fine.