@noncom here is a sample test app that I’ve been using to run jME using JOGL with multiple JFrames:
import com.jme3.app.Application;
import com.jme3.app.SimpleApplication;
import com.jme3.system.AppSettings;
import com.jme3.system.JmeCanvasContext;
import com.jme3.util.JmeFormatter;
import jme3test.model.TestMonkeyHead;
import jme3test.model.anim.TestBlenderObjectAnim;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.logging.ConsoleHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;
public class TestMultipleCanvas {
public static Component createCanvas(AppSettings settings, Application app) {
JmeCanvasContext context = (JmeCanvasContext) app.getContext();
Component comp = context.getCanvas();
comp.setSize(settings.getWidth(), settings.getHeight());
return comp;
}
private static AppSettings createSettings() {
AppSettings settings = new AppSettings(true);
// settings.setVSync(true);
settings.setFrameRate(60);
settings.setAudioRenderer(null);
settings.setWidth(800);
settings.setHeight(600);
settings.setRenderer("JOGL");
return settings;
}
private static Application createApp(Class<? extends Application> appClass, AppSettings settings) {
Application app = null;
try {
app = appClass.newInstance();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
app.setPauseOnLostFocus(false);
app.setSettings(settings);
app.createCanvas();
app.startCanvas();
return app;
}
public static void startApp(Application... apps) {
for (final Application app : apps) {
app.startCanvas();
app.enqueue(new Callable<Void>() {
public Void call() {
if (app instanceof SimpleApplication) {
SimpleApplication simpleApp = (SimpleApplication) app;
simpleApp.getFlyByCamera().setDragToRotate(true);
}
return null;
}
});
}
}
public static void main(String[] args) {
JPopupMenu.setDefaultLightWeightPopupEnabled(false);
JmeFormatter formatter = new JmeFormatter();
Handler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(formatter);
Logger.getLogger("").removeHandler(Logger.getLogger("").getHandlers()[0]);
Logger.getLogger("").addHandler(consoleHandler);
AppSettings settings = createSettings();
List<Class<? extends Application>> appClasses = getAppClasses();
for (Class<? extends Application> appClass : appClasses) {
final Application app = createApp(appClass, settings);
startApp(app);
final Component canvas1 = createCanvas(settings, app);
init(canvas1, new JFrame(appClass.getSimpleName()), app);
}
}
private static List<Class<? extends Application>> getAppClasses() {
List<Class<? extends Application>> appClasses = new LinkedList<>();
/*
As many Application classes as you want
*/
appClasses.add(TestBlenderObjectAnim.class);
appClasses.add(TestMonkeyHead.class);
return appClasses;
}
private static void init(final Component canvas, final JFrame frame, final Application app) {
frame.add(canvas);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
app.stop();
}
});
}
}
Just make sure all the JOGL binaries are on your classpath.