Login  Register

Re: Jogl and JavaFX

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.
Julien Gouesse | Personal blog | Website