JMEDesktop inside an applet

I am trying to run the HelloJMEDesktop.java example, but inside a SimpleJMEApplet. I can't make this work, when I click the button it throws a thread related exception:



Exception in thread "AWT-EventQueue-1" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread

at java.awt.EventQueue.invokeAndWait(EventQueue.java:834)

at javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.java:1257)

at com.jmex.awt.swingui.JMEDesktop.onKey(Unknown Source)

at com.jmex.awt.swingui.JMEDesktop$KeyUpdateAction.performAction(Unknown Source)

at com.jme.input.ActionTrigger.performAction(Unknown Source)

at com.jme.input.keyboard.KeyboardInputHandlerDevice$KeyTrigger.performAction(Unknown Source)

at com.jme.input.InputHandler.processTriggers(Unknown Source)

at com.jme.input.InputHandler.update(Unknown Source)

at com.jme.input.InputHandler.updateAttachedHandlers(Unknown Source)

at com.jme.input.InputHandler.update(Unknown Source)

at com.jmex.awt.applet.SimpleJMEApplet$SimpleAppletCanvasImplementor.simpleUpdate(Unknown Source)

at com.jmex.awt.SimpleCanvasImpl.doUpdate(Unknown Source)

at com.jmex.awt.lwjgl.LWJGLCanvas.paintGL(Unknown Source)

at org.lwjgl.opengl.AWTGLCanvas.paint(AWTGLCanvas.java:308)

at org.lwjgl.opengl.AWTGLCanvas.update(AWTGLCanvas.java:339)

at sun.awt.RepaintArea.updateComponent(RepaintArea.java:267)

at sun.awt.RepaintArea.paint(RepaintArea.java:233)

at apple.awt.ComponentModel.handleEvent(ComponentModel.java:251)

at java.awt.Component.dispatchEventImpl(Component.java:4097)

at java.awt.Component.dispatchEvent(Component.java:3869)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)




public class HelloJMEDesktopApplet extends SimpleJMEApplet {
    private Node guiNode;

   

Sounds like JMEDesktop should check whether its in the EventDispachThread before calling invokeAndWait.



Something like:



Runnable toRun = new Runnable() {
     public void run() {
          // the code to run in the EventDispatchThread
     }
}

if ( SwingUtilities.isEventDispatchThread() )
     toRun.run();
else
     SwingUtilities.invokeAndWait( toRun );

Related:

http://www.jmonkeyengine.com/jmeforum/index.php?topic=11573.0