• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Tim Cooke
  • Liutauras Vilda
  • Jeanne Boyarsky
  • paul wheaton
Sheriffs:
  • Ron McLeod
  • Devaka Cooray
  • Henry Wong
Saloon Keepers:
  • Tim Holloway
  • Stephan van Hulst
  • Carey Brown
  • Tim Moores
  • Mikalai Zaikin
Bartenders:
  • Frits Walraven

problems with FXMLLoader | openjfx and openjdk11

 
Greenhorn
Posts: 22
IntelliJ IDE Java
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
hi, i'm trying to use openjdk11 and openjfx in my project. it works fine until i try using .fxml files.
thank you for upcomming answers!

i get this stacktrace:




this is my Main class:



here is my build.gradle file:





 
Sheriff
Posts: 7125
184
Eclipse IDE Postgres Database VI Editor Chrome Java Ubuntu
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
This looks like a Java 9 (and up) module problem.  I'm not really up on the subject, but this might get you started:

Do you have a modules-info.java file?  You may need to add lines like this:
If that doesn't help I would (1) wait for someone more knowledgeable to post, or (2) Google module-info.java.
 
Bartender
Posts: 390
47
Firefox Browser MySQL Database Java Ubuntu
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I have been digging into this issue, and as this thread comes up when searching these errors, so I think it's worth waking up.

I assume you are using IntelliJ, and have added the JavaFx SDK to your project as a library (you did that with Gradle).

The issue is, as Knute said, with the Java 9 modules. All code in Java 9+ is part of a module. When you do not provide a module descriptor, it runs in a module called the unnamed module, which reads all named modules and exports all of its packages. The main issue here is that code in the unnamed module can't access the JavaFx libraries.

In this case you have a few options:
1 - Use the JavaFx plugin for Maven or Gradle to run your project
2 - Add a module descriptor to your project
3 - Override the module behaviour using VM arguments

First method — Using the JavaFx plugin:
You are using Gradle, so you can run your project using the JavaFx plugin. See here for an example. You can do the same with Maven.

I’d also like to show how to get things to run via the IDE, which is pretty easy too.

Second method — Adding a module descriptor:
This is also very easy and a good way to go. Java has been modular for a couple of years now, and it's time to modularize!  
Add a module-info.java file to your project. Your IDE should have an option to create a module descriptor for your project. Open it up and it should look like this:
JavaFx works by reflection, but reflective access of a module's contents is denied by default. We need to use the opens keyword to open our new module up to reflection.
We also need to read to read the JavaFx modules needed. You are using javafx.fxml, and I'm sure you will also use javafx.controls. We need to show our dependency on them with the requires keyword.

This is how our module descriptor will look:
(For more info about modules and the module descriptor, take a look at this Oracle article)

Third method — Adding VM arguments:
This is pretty much a more ‘hacky’ way of doing the same thing. Your code should be compiling fine. To run it, though, we need to tweak the run configuration.

We need to put the JavaFx modules on the module path manually this way. This we can do by opening up Run > Edit Configurations and adding ‘--module-path /<path to JavaFx SDK>/lib/’ to the VM options.

We’ll also need access to them. The biggest issue with having your code in the unnamed module is that some modules don’t become part of its module graph (the modules it has access to), regardless of whether they are on the module path or not. We’ll have to add the JavaFx modules we need to the your module’s module graph manually. For this we’ll have to use the java tools --add-modules option to add javafx.fxml and javafx.controls. We’ll add this to the VM options after what we have already put: ‘--add-modules javafx.controls,javafx.fxml’. Make sure you don’t put a space between the two.
(You can read up to the java tool and its options here.)

Note that the command that IntelliJ is using to run your program (printed at the top of the console) contains ‘--add-modules javafx.base,javafx.graphics’. That is why you could run your program until you started using fxml.

Now everything should be set and ready to go!
 
Marshal
Posts: 79964
396
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Moving to our FX forum.
 
I'm still in control here. LOOK at this tiny ad!
Gift giving made easy with the permaculture playing cards
https://coderanch.com/t/777758/Gift-giving-easy-permaculture-playing
reply
    Bookmark Topic Watch Topic
  • New Topic