Hi,
I have a problem (and some workaround) when creating a GLCanvas from the AWT thread: I open a JFrame with a JButton inside that, when pressed, triggers the creation of a GLCanvas that is added to the frame's content pane.
When the creation of the GLCanvas triggers a reshape (I call setSize), I get the following exception:
net.java.games.jogl.GLException: Unable to lock surface
(stack trace at end).
A workaround that I found is to create a new thread in the actionPerformed of the button-listener (AWT thread) and
create the GLCanvas in the new thread. The button
code is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| JButton button = new JButton( "Activate Gears" ); button.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { Thread init_3d_thread = new Thread() { public void run() { startGears( pane ); } };
init_3d_thread.start();
try { init_3d_thread.join(); } catch ( InterruptedException ex ) { ex.printStackTrace(); } |
The AWT thread just waits until the creation of the GLCanvas finishes (in startGears), but it works.
Anybody know what is going wrong (or what I am doing wrong) and why the workaround works?
I'm running under windows. I've got a modified gears demo that demonstrates the problem if needed.
Thanks,
Frank.
PS. Stack trace:
1 2 3 4 5 6 7 8 9 10 11 12
| net.java.games.jogl.GLException: Unable to lock surface at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.lockSurface(WindowsOnscreenGLContext.java:155) at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.makeCurrent(WindowsOnscreenGLContext.java:107) at net.java.games.jogl.impl.GLContext.invokeGL(GLContext.java:199) at net.java.games.jogl.GLCanvas.reshape(GLCanvas.java:105) at java.awt.Component.setBounds(Component.java:1664) at java.awt.Component.resize(Component.java:1601) at java.awt.Component.setSize(Component.java:1593) at Gears.startGears(Gears.java:93) at Gears$1.actionPerformed(Gears.java:61) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786) ... |