sshahine / JFoenix

JavaFX Material Design Library
MIT License
6.29k stars 1.06k forks source link

JDK 12 incompatible #955

Open chengenzhao opened 5 years ago

chengenzhao commented 5 years ago

Hi: Today JDK 12 is released and one interesting change is they make javafx.scene.control.skin.TextFieldSkin members private thus for JFoenix we will get some exception like: java.lang.IllegalAccessException: class com.jfoenix.skins.JFXTextFieldSkin cannot access a member of class javafx.scene.control.skin.TextFieldSkin with modifiers "private" at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:355)

so any ideas how we should fix this problem?

jackpeters667 commented 4 years ago

@jfoenixadmin It's not working for me, I'm on gradle (JDK and JavaFX 14) and I tried adding those arguments in my gradle.properties and in the Run Configuration from Intellij and I still get the same error from the same issue that @rruffer had.

jackpeters667 commented 4 years ago

@jfoenixadmin It's not working for me, I'm on gradle (JDK and JavaFX 14) and I tried adding those arguments in my gradle.properties and in the Run Configuration from Intellij and I still get the same error from the same issue that @rruffer had.

Nevermind, I'm sorted. I had to use --add-opens=java.base/java.lang.reflect=com.jfoenix

The = after opens was key

rruffer commented 4 years ago

I had a problem with gradle and java 14. I couldn't solve it. In the maven I did it.

kowlown commented 4 years ago

@jfoenixadmin It's not working for me, I'm on gradle (JDK and JavaFX 14) and I tried adding those arguments in my gradle.properties and in the Run Configuration from Intellij and I still get the same error from the same issue that @rruffer had.

Nevermind, I'm sorted. I had to use --add-opens=java.base/java.lang.reflect=com.jfoenix

The = after opens was key

@jackpeters667 where do you place these options in gradle ?

rruffer commented 4 years ago

I saw it that way: http://quabr.com:8182/58133725/how-to-fix-jvm-options-exports-javafx-11-to-com-jfoenix-on-gradle-idea

But it would be better to ask the developers of the plugin. In the git the maven plugin teaches. They should show it too: https://github.com/openjfx/javafx-gradle-plugin

rnayabed commented 4 years ago

after adding the args that @seinecle mentioned im still getting the same issue

seinecle commented 4 years ago

@dubbadhar your --add-opens argument did not work, that is what the exception says. You could try to launch your app through a Maven build instead of pure javac and java.exe. Using Maven, you would place the --add-opens argument in the pom.xml, following the instructions in the link I shared.

sawaYch commented 4 years ago

Okay, I figure out the workaround for my project ((Thank you so much for the replies above My project is a NON-modular project, using javafx and jfoenix with Gradle.
I will give out the setup (build.gradle) that works for me as below. Remember to upgrade jfoenix to latest version (i.e. currently v9.0.10)!

... // some project config, skip it here

repositories {
    mavenCentral()
}

javafx {
    version = "13"
    modules = [ 'javafx.controls', 'javafx.graphics', 'javafx.fxml' ]
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'com.h2database', name: 'h2', version: '1.4.200'
    compile 'com.jfoenix:jfoenix:9.0.10'
    compile group: 'org.mindrot', name: 'jbcrypt', version: '0.4'
}

run{
    jvmArgs = [
            "--add-exports=javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED",
            "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED",
            "--add-exports=javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED",
            "--illegal-access=warn",
            "--add-opens=javafx.controls/javafx.scene.control.skin=com.jfoenix",
            "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
            "--add-opens=java.base/java.lang.reflect=com.jfoenix"
    ]
}

...
sprintcorp commented 4 years ago

@seinecle after adding the args to my VM in itellij this is what i get in my console

WARNING: Unknown module: com.jfoenix specified to --add-opens
java.lang.IllegalAccessException: class com.jfoenix.skins.JFXTextFieldSkin cannot access a member of class javafx.scene.control.skin.TextFieldSkin (in module javafx.controls) with modifiers "private"
    at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:376)
    at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:642)
    at java.base/java.lang.reflect.Field.checkAccess(Field.java:1075)
    at java.base/java.lang.reflect.Field.get(Field.java:416)
    at com.jfoenix.skins.JFXTextFieldSkin.createPromptNode(JFXTextFieldSkin.java:152)
    at com.jfoenix.skins.JFXTextFieldSkin.lambda$new$1(JFXTextFieldSkin.java:70)
    at com.jfoenix.skins.PromptLinesWrapper.init(PromptLinesWrapper.java:122)
    at com.jfoenix.skins.JFXTextFieldSkin.<init>(JFXTextFieldSkin.java:70)
    at com.jfoenix.controls.JFXTextField.createDefaultSkin(JFXTextField.java:69)
    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:1400)
    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:9542)
    at javafx.graphics/javafx.scene.Scene.doCSSPass(Scene.java:569)
    at javafx.graphics/javafx.scene.Scene.preferredSize(Scene.java:1781)
    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 sample.Main.start(Main.java:16)
    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.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:830)
java.lang.IllegalAccessException: class com.jfoenix.skins.JFXTextFieldSkin cannot access a member of class javafx.scene.control.skin.TextFieldSkin (in module javafx.controls) with modifiers "private"
    at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:376)
    at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:642)
    at java.base/java.lang.reflect.Field.checkAccess(Field.java:1075)
    at java.base/java.lang.reflect.Field.get(Field.java:416)
    at com.jfoenix.skins.JFXTextFieldSkin.createPromptNode(JFXTextFieldSkin.java:152)
    at com.jfoenix.skins.JFXTextFieldSkin.lambda$new$1(JFXTextFieldSkin.java:70)
    at com.jfoenix.skins.PromptLinesWrapper.init(PromptLinesWrapper.java:122)
    at com.jfoenix.skins.JFXTextFieldSkin.<init>(JFXTextFieldSkin.java:70)
    at com.jfoenix.controls.JFXPasswordField.createDefaultSkin(JFXPasswordField.java:61)
    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:1400)
    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:9542)
    at javafx.graphics/javafx.scene.Scene.doCSSPass(Scene.java:569)
    at javafx.graphics/javafx.scene.Scene.preferredSize(Scene.java:1781)
    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 sample.Main.start(Main.java:16)
    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.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:830)
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:830)
Caused by: java.lang.NullPointerException
    at com.jfoenix.skins.JFXTextFieldSkin.updateTextPos(JFXTextFieldSkin.java:109)
    at com.jfoenix.skins.JFXTextFieldSkin.layoutChildren(JFXTextFieldSkin.java:93)
    at javafx.controls/javafx.scene.control.Control.layoutChildren(Control.java:601)
    at javafx.graphics/javafx.scene.Parent.layout(Parent.java:1207)
    at javafx.graphics/javafx.scene.Parent.layout(Parent.java:1214)
    at javafx.graphics/javafx.scene.Scene.doLayoutPass(Scene.java:576)
    at javafx.graphics/javafx.scene.Scene.preferredSize(Scene.java:1784)
    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 sample.Main.start(Main.java:16)
    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.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    ... 1 more
Exception running application sample.Main

Process finished with exit code 1

Pls any idea of what am to do

sprintcorp commented 4 years ago

This is what i have in my VM --module-path "C:\Program Files\javafx-sdk-14.0.1\lib" --add-modules=javafx.controls,javafx.fxml --add-opens=java.base/java.lang.reflect=com.jfoenix

seyerman commented 4 years ago

If someone doesn't work to add the --add-opens to gradle or maven config files, I recommend read carefully your error because you can add some extra parameter depending of your type of error, but the solution is similar to the other params.

For example, when I added this --add-opens options, the error remained but my error was:

...cannot access class com.sun.javafx.event.EventHandlerManager (in module javafx.base) because module javafx.base does not export com.sun.javafx.event...

, then I added:

--add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED,

to my build.gradle, and it works!

Bhavan24 commented 3 years ago

--module-path "#####your javafx library path####" --add-modules javafx.controls,javafx.fxml --add-opens java.base/java.lang.reflect=ALL-UNNAMED

Add these to your VM option make sure to give your javafx library path

mattiasflodin commented 3 years ago

Adding just --add-opens=java.base/java.lang.reflect=com.jfoenix to VM options worked around this for me on JDK 11.

FelipeAumannRS commented 3 years ago

LAST UPDATE: Thank you a lot, @sawaYch , your comment made everything work in my modular gradle project, what a valuable comment, thanks!!!

Ok, so according to @seinecle link, adding an open to vm arg should fix it: --add-opens java.base/java.lang.reflect=ALL-UNNAMED or --add-opens java.base/java.lang.reflect=com.jfoenix @seinecle can you verify the fix?

No, unfortunately, that doesn't work. Instead, now I'm getting 3 new errors while trying to run my project:

` Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. Execution failed for task ':run'.

Process 'command 'C:\Program Files\Java\jdk-14.0.2\bin\java.exe'' finished with non-zero exit value 1 `

Note that I'm using modular gradle in my project, which means that I'm using modular-info.java. The following code was added in order to implement the suggested VM options:

`run { jvmArgs = [ "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix", "--add-exports=javafx.controls/com.sun.javafx.scene.control=com.jfoenix", "--add-exports=javafx.base/com.sun.javafx.binding=com.jfoenix", "--add-exports=javafx.graphics/com.sun.javafx.stage=com.jfoenix", "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix", "--add-opens java.base/java.lang.reflect=ALL-UNNAMED"

] }

compileTestJava { options.compilerArgs.add('--add-opens java.base/java.lang.reflect=com.jfoenix') }`

@jfoenixadmin Any thoughts?

slimaneouragh commented 3 years ago

--add-opens=java.base/java.lang.reflect=com.jfoenix @jfoenixadmin thanks Problem solved with me 🎓

asad-albadi commented 2 years ago

Okay, I figure out the workaround for my project ((Thank you so much for the replies above My project is a NON-modular project, using javafx and jfoenix with Gradle. I will give out the setup (build.gradle) that works for me as below. Remember to upgrade jfoenix to latest version (i.e. currently v9.0.10)!

... // some project config, skip it here

repositories {
    mavenCentral()
}

javafx {
    version = "13"
    modules = [ 'javafx.controls', 'javafx.graphics', 'javafx.fxml' ]
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'com.h2database', name: 'h2', version: '1.4.200'
    compile 'com.jfoenix:jfoenix:9.0.10'
    compile group: 'org.mindrot', name: 'jbcrypt', version: '0.4'
}

run{
    jvmArgs = [
            "--add-exports=javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED",
            "--add-exports=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED",
            "--add-exports=javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED",
            "--illegal-access=warn",
            "--add-opens=javafx.controls/javafx.scene.control.skin=com.jfoenix",
            "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED",
            "--add-opens=java.base/java.lang.reflect=com.jfoenix"
    ]
}

...

This is correct it worked for me adding "--add-opens=java.base/java.lang.reflect=com.jfoenix" to Run/Debug Configurations > Build and run image