Hi all, I opened a proposal for an extension of the javafx.scene.Scene API to allow to add a stylesheet using a typed java.net.URL.
Currently the Scene class offers a list of stylesheet URLs in their stringified representation accessible by Scene.getStylesheets(). The problem is that in some cases an URL instance encapsulates internal state that gets lost in the conversion into its external form and back into an URL instance, namely information on an URL handler. This ultimately results in a failure (IOException file not found) when the Screen class tries to load a stylesheet though code that loads the file contents using URL#openStream() on the original URL instance can read the file contents successfully. In my case the problem showed up when creating an executable jar file containing my JavaFX application (using OneJar). The application startup in this case installs a customized Classloader that implements special logic for accessing the jars contained classes, This works transparently for classes and resources, but the URLs returned by Class#getResource( name ) do not survive the conversion to string and back because of the described reason. There is a workaround that caches the resource in a temporary file and passes this file's URL to the Scene's list of stylesheets, but this poses other problems. As a remark, other APIs in JavaFX use the same pattern of expecting stringified URLs like the Image() constructor and have the same problem, but offer alternative constructors accepting a stream which allows to solve the problem nicely. Please discuss and decide if the proposal can be added as a change request for JavaFX. Best wishes, Michael.