I have a gradle project in eclipse. Here is the structure of my project
I have css resource styleclass.css
in scr/main/resources/css
. First I tried to access it using
scene.getStylesheets().add("css/styleclass.css");
But I was getting warning resource not found.
I also tried it by removing module-info.java
file. But result is same.
Then I tried it using
String urlString = ComboBoxStyling.class.getClassLoader().getResource("css/styleclass.css").toExternalForm();
Problem is, this line works if I remove moduele-info.java
and style sheet applied. But with module-info.java
I am getting null pointer exception.
I don't know much but atleast I know that class loader have changes in Java 9. So how can I do the same in Java 9. My module-info.java
file contains the following
module pk.training.basit {
exports pk.training.basit;
requires transitive javafx.controls;
}
Thanks & Regards
Basit Mahmood Ahmed
From ClassLoader.getResource
JavaDoc:
Resources in named modules are subject to the encapsulation rules specified by Module.getResourceAsStream. Additionally, and except for the special case where the resource has a name ending with ".class", this method will only find resources in packages of named modules when the package is opened unconditionally (even if the caller of this method is in the same module as the resource).
So, to fix your issue, you should make the package css
open:
module pk.training.basit {
exports pk.training.basit;
requires transitive javafx.controls;
opens css;
}
You should put your css in the same package as the class which uses it, then use Class.getResource to access it, with the relative Path.
src/main/java:
pk.training.basit
ComboBoxStyling.java
src/main/resources:
pk.training.basit
ComboBoxStyling.css
Then in the source:
scene.getStylesheets().add(
ComboBoxStyling.class.getResource("ComboBoxStyling.css").toExternalForm());
Personnally I think it's even a better practice to put the css and the class in the same directory, then configure gradle so It can take the resources in the src/main directory. It permits to have an architecture analog to other GUI products (Angular) which places all the resources of a screen including the source in the same directory, the FXML file for example if you had one.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With