1

I'm trying to use the JFoenix library in Scene Builder.
This is what I have so far:

I added the Maven dependency:

    <dependency>
        <groupId>com.jfoenix</groupId>
        <artifactId>jfoenix</artifactId>
        <version>9.0.8</version>
    </dependency>

and the JFoenix jar into Scene Builder.

The new plugins have successfully been added to my library:

library

When I now drag a JFXButton into my scene, I can compile it.
But when I drag a more complex Item, e.g. JFXTabPane and try to compile it, I get the following error:

--- javafx-maven-plugin:0.0.2:run (default-cli) ---
Using 'UTF-8' encoding to copy filtered resources.
Copying 5 resources
Changes detected - recompiling the module!
Compiling 2 source files to /home/user/NetBeansProjects/App1/target/classes
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin (in module com.jfoenix) cannot access class com.sun.javafx.scene.control.behavior.TabPaneBehavior (in module javafx.controls) because module javafx.controls does not export com.sun.javafx.scene.control.behavior to module com.jfoenix
    at com.jfoenix/com.jfoenix.skins.JFXTabPaneSkin.<init>(JFXTabPaneSkin.java:86)
    at com.jfoenix/com.jfoenix.controls.JFXTabPane.createDefaultSkin(JFXTabPane.java:67)
    at javafx.controls/javafx.scene.control.Control.doProcessCSS(Control.java:897)
    at javafx.controls/javafx.scene.control.Control$1.doProcessCSS(Control.java:89)
    at javafx.controls/com.sun.javafx.scene.control.ControlHelper.processCSSImpl(ControlHelper.java:67)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.processCSS(NodeHelper.java:145)
    at javafx.graphics/javafx.scene.Parent.doProcessCSS(Parent.java:1399)
    at javafx.graphics/javafx.scene.Parent$1.doProcessCSS(Parent.java:125)
    at javafx.graphics/com.sun.javafx.scene.ParentHelper.processCSSImpl(ParentHelper.java:98)
    at javafx.graphics/com.sun.javafx.scene.NodeHelper.processCSS(NodeHelper.java:145)
    at javafx.graphics/javafx.scene.Node.processCSS(Node.java:9540)
    at javafx.graphics/javafx.scene.Scene.doCSSPass(Scene.java:569)
    at javafx.graphics/javafx.scene.Scene.preferredSize(Scene.java:1745)
    at javafx.graphics/javafx.scene.Scene$2.preferredSize(Scene.java:393)
    at javafx.graphics/com.sun.javafx.scene.SceneHelper.preferredSize(SceneHelper.java:66)
    at javafx.graphics/javafx.stage.Window$12.invalidated(Window.java:1086)
    at javafx.base/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
    at javafx.base/javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:145)
    at javafx.graphics/javafx.stage.Window.setShowing(Window.java:1174)
    at javafx.graphics/javafx.stage.Window.show(Window.java:1189)
    at javafx.graphics/javafx.stage.Stage.show(Stage.java:273)
    at App1.App.start(App.java:17)
    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:389)
    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)
    ... 1 more
Exception running application App1.App
Command execution failed.
org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
    at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:404)
    at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166)
    at org.openjfx.JavaFXBaseMojo.executeCommandLine(JavaFXBaseMojo.java:447)
    at org.openjfx.JavaFXBaseMojo.executeCommandLine(JavaFXBaseMojo.java:409)
    at org.openjfx.JavaFXRunMojo.execute(JavaFXRunMojo.java:97)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
    at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:404)
    at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166)
    at org.openjfx.JavaFXBaseMojo.executeCommandLine(JavaFXBaseMojo.java:447)
    at org.openjfx.JavaFXBaseMojo.executeCommandLine(JavaFXBaseMojo.java:409)
    at org.openjfx.JavaFXRunMojo.execute(JavaFXRunMojo.java:97)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

As stated here: https://github.com/jfoenixadmin/JFoenix/issues/889#issuecomment-450744122

I already added

--module-path=/home/user/javafx-sdk-12.0.1/lib
--add-modules=javafx.base, javafx.controls, javafx.fxml, javafx.graphics, javafx.media, javafx.swing, javafx.web
--add-opens
javafx.base/com.sun.javafx.runtime=ALL-UNNAMED
--add-opens
javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED
--add-opens
javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED
--add-opens
javafx.base/com.sun.javafx.binding=ALL-UNNAMED
--add-opens
javafx.base/com.sun.javafx.event=ALL-UNNAMED
--add-opens
javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED

But it doesn't help.

My Tools:

  • Java 12
  • Netbeans 12
  • JavaFX 12
  • Scene Builder 11

Update:

Strangely enough, Netbeans movies some of my VM Options into the Arguments bar:

enter image description here

Evgenij Reznik
  • 17,916
  • 39
  • 104
  • 181
  • What version of Java are you using? – DaveCat May 14 '19 at 14:31
  • 1
    Try `--add-opens javafx.graphics/com.sun.javafx.scene.control.behavior=com.jfoenix`. – Slaw May 14 '19 at 14:33
  • @DaveCat: Java 12 – Evgenij Reznik May 14 '19 at 14:53
  • @Slaw: Getting the same error – Evgenij Reznik May 14 '19 at 14:57
  • Kind of a hacky idea, but have you tried using an older version of Javafx? I know it's not an ideal solution, but what response do you get if you use this dependency, clean, and rebuild? com.jfoenix jfoenix 9.0.1 – DaveCat May 14 '19 at 15:01
  • @DaveCat: Using JFX 11 and JFoenix 9.0.1. didn't change anything. Unfortunately I can't use any older JFX version, as I need to use the newest components. – Evgenij Reznik May 14 '19 at 15:08
  • Are you getting the _exact_ same error or is there a different message? – Slaw May 14 '19 at 15:11
  • Possible duplicated of this [question](https://stackoverflow.com/questions/55889654/illegalaccessexception-for-jfxtextfield-with-java-sdk-12/55892520), JFoenix 9.0.8 doesn't work with Java 12. However, it does work with Java 11 and JavaFX 12. – José Pereda May 14 '19 at 15:22
  • @JoséPereda: I followed the instruction in your link: Changed Java to 11.0.2, but still getting the same error. Btw. my error message is slightly different: `IllegalAccessException` vs. `IllegalAccessError` – Evgenij Reznik May 15 '19 at 11:38
  • Yes, you are right, it is not the same error. However, I can run your use case with Java/JavaFX 12, see my answer. – José Pereda May 15 '19 at 12:21

1 Answers1

3

Though there is an issue with JFoenix 9.0.8 and Java 12 (use of unsafe in some components like JFXTextField), this issue doesn't prevent from running a JFXTabPane component with Java and JavaFX 12.0.1.

Based on this helloFX sample, I've edited its FXML file to include a JFXTabPane with one tab:

JFoenix

And the pom looks like:

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>12.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>12.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.jfoenix</groupId>
        <artifactId>jfoenix</artifactId>
        <version>9.0.8</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>12</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.2</version>
            <configuration>
                <mainClass>org.openjfx.App</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

However, when running mvn clean javafx:run I get the exception reported:

Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin \
    (in module com.jfoenix) cannot access class com.sun.javafx.scene.control.behavior.TabPaneBehavior \ 
    (in module javafx.controls) because module javafx.controls \
    does not export com.sun.javafx.scene.control.behavior to module com.jfoenix

So following the advice, I'll modify the javafx-maven-plugin to avoid it:

<configuration>
    <mainClass>org.openjfx.App</mainClass>
    <options>
        <option>--add-opens</option>
        <option>javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix</option>
    </options>
</configuration>

Now running mvn clean javafx:run I get a new exception:

Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin$TabHeaderContainer (in module com.jfoenix) \
    cannot access class com.sun.javafx.scene.control.LambdaMultiplePropertyChangeListenerHandler \ 
    (in module javafx.controls) because \
    module javafx.controls does not export com.sun.javafx.scene.control to module com.jfoenix

So we add this new option to the plugin:

<configuration>
    <mainClass>org.openjfx.App</mainClass>
    <options>
        <option>--add-opens</option>
        <option>javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix</option>
        <option>--add-opens</option>
        <option>javafx.controls/com.sun.javafx.scene.control=com.jfoenix</option>
    </options>
</configuration>

Finally, mvn clean javafx:run works fine:

Run JFoenix

Note that if you don't use the plugin, you can also run in command line, something like:

java \
--add-opens javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix \
--add-opens javafx.controls/com.sun.javafx.scene.control=com.jfoenix \
--module-path /Users/user/.m2/repository/com/jfoenix/jfoenix/9.0.8/jfoenix-9.0.8.jar:\
    /Users/user/javafx-sdk-12.0.1/lib \
--add-modules com.jfoenix,javafx.controls,javafx.fxml \
-classpath hellofx/target/classes \
org.openjfx.App

If you check this command line, you will notice that yours was missing the com.jfoenix module from --add-modules, and that would explain why your "--add-opens" didn't work.

José Pereda
  • 44,311
  • 7
  • 104
  • 132