Posted by
gouessej on
Apr 04, 2020; 9:42pm
URL: https://forum.jogamp.org/Jogl-and-JavaFX-tp4040468p4040511.html
This is my first attempt:
package org.jogamp.joglojfx;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GL2ES1;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.fixedfunc.GLLightingFunc;
import com.jogamp.opengl.fixedfunc.GLMatrixFunc;
import com.jogamp.newt.NewtFactory;
import com.jogamp.newt.Screen;
import com.jogamp.newt.javafx.NewtCanvasJFX;
import com.jogamp.newt.opengl.GLWindow;
import com.jogamp.opengl.util.Animator;
public class App extends Application {
@Override
public void start(Stage stage) {
Platform.setImplicitExit(false);
final Group g = new Group();
Scene scene = new Scene(g, 800, 600);
stage.setScene(scene);
stage.show();
com.jogamp.newt.Display jfxNewtDisplay = NewtFactory.createDisplay(null, false);
final Screen screen = NewtFactory.createScreen(jfxNewtDisplay, 0);
final GLCapabilities caps = new GLCapabilities(GLProfile.getDefault());
final GLWindow glWindow1 = GLWindow.create(screen, caps);
glWindow1.addGLEventListener(new GLEventListener() {
private float rotateT = 0.0f;
public void init(final GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
gl.glShadeModel(GLLightingFunc.GL_SMOOTH);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClearDepth(1.0f);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glHint(GL2ES1.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
}
public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {
GL2 gl = drawable.getGL().getGL2();
final float aspect = (float) width / (float) height;
gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();
final float fh = 0.5f;
final float fw = fh * aspect;
gl.glFrustumf(-fw, fw, -fh, fh, 1.0f, 1000.0f);
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void display(final GLAutoDrawable drawable) {
final GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -5.0f);
// rotate about the three axes
gl.glRotatef(rotateT, 1.0f, 0.0f, 0.0f);
gl.glRotatef(rotateT, 0.0f, 1.0f, 0.0f);
gl.glRotatef(rotateT, 0.0f, 0.0f, 1.0f);
// Draw A Quad
gl.glBegin(GL2.GL_QUADS);
gl.glColor3f(0.0f, 1.0f, 1.0f); // set the color of the quad
gl.glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left
gl.glVertex3f( 1.0f, 1.0f, 0.0f); // Top Right
gl.glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
gl.glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
// Done Drawing The Quad
gl.glEnd();
// increasing rotation for the next iteration
rotateT += 0.2f;
}
public void dispose(final GLAutoDrawable drawable) {
}
});
final NewtCanvasJFX glCanvas = new NewtCanvasJFX(glWindow1);
glCanvas.setWidth(800);
glCanvas.setHeight(600);
g.getChildren().add(glCanvas);
final Animator anim = new Animator(glWindow1);
anim.start();
}
public static void main(String[] args) {
launch();
}
}
I obtain the following error message:
Exception in thread "JavaFX Application Thread" com.jogamp.nativewindow.NativeWindowException: Error getting JFX-Thread
at com.jogamp.nativewindow.javafx.JFXAccessor.getJFXThread(JFXAccessor.java:192)
at com.jogamp.nativewindow.javafx.JFXAccessor.isJFXThreadOrHasJFXThreadStopped(JFXAccessor.java:217)
at com.jogamp.nativewindow.javafx.JFXAccessor.runOnJFXThread(JFXAccessor.java:160)
at com.jogamp.nativewindow.javafx.JFXAccessor.getWindowHandle(JFXAccessor.java:272)
at com.jogamp.newt.javafx.NewtCanvasJFX.validateNative(NewtCanvasJFX.java:338)
at com.jogamp.newt.javafx.NewtCanvasJFX.repaintAction(NewtCanvasJFX.java:174)
at com.jogamp.newt.javafx.NewtCanvasJFX.access$200(NewtCanvasJFX.java:83)
at com.jogamp.newt.javafx.NewtCanvasJFX$5.changed(NewtCanvasJFX.java:163)
at com.jogamp.newt.javafx.NewtCanvasJFX$5.changed(NewtCanvasJFX.java:153)
at javafx.base/com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:181)
at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.base/javafx.beans.property.ReadOnlyObjectPropertyBase.fireValueChangedEvent(ReadOnlyObjectPropertyBase.java:74)
at javafx.base/javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:102)
at javafx.graphics/javafx.scene.Node$ReadOnlyObjectWrapperManualFire.fireSuperValueChangedEvent(Node.java:1050)
at javafx.graphics/javafx.scene.Node.invalidatedScenes(Node.java:1121)
at javafx.graphics/javafx.scene.Node.setScenes(Node.java:1159)
at javafx.graphics/javafx.scene.Parent.scenesChanged(Parent.java:772)
at javafx.graphics/javafx.scene.Node.invalidatedScenes(Node.java:1072)
at javafx.graphics/javafx.scene.Node.setScenes(Node.java:1159)
at javafx.graphics/javafx.scene.Scene$8.invalidated(Scene.java:1225)
at javafx.base/javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
at javafx.base/javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:147)
at javafx.graphics/javafx.scene.Scene.setRoot(Scene.java:1178)
at org.jogamp.joglojfx.App.start(App.java:99)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.IllegalAccessException: class com.jogamp.nativewindow.javafx.JFXAccessor cannot access class com.sun.javafx.tk.Toolkit (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.tk to unnamed module @250db1c8
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:376)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:647)
at java.base/java.lang.reflect.Method.invoke(Method.java:556)
at com.jogamp.nativewindow.javafx.JFXAccessor.getJFXThread(JFXAccessor.java:190)
... 32 more
(java:16378): Gdk-WARNING **: 23:32:19.706: XSetErrorHandler() called with a GDK error trap pushed. Don't do that.
^CX11Util.Display: Shutdown (JVM shutdown: true, open (no close attempt): 1/1, reusable (open, marked uncloseable): 0, pending (open in creation order): 1)
X11Util: Open X11 Display Connections: 1
X11Util: Open[0]: NamedX11Display[:0, 0x7f1fd5d43c60, refCount 1, unCloseable false]
Sven, does it work with an older version of Java? I use Java 14 and OpenJFX 14.