我可以在没有JVM重启的情况下在JavaFX 8中重新加载样式表吗?

osk*_*rkv 5 java javafx clojure javafx-8

我正在使用Java 1.8u25,我正在使用如下的样式表(Java和Clojure等价物).

//Java
new Pane().getStylesheets().add("some_style.css")

//Clojure
(doto (Pane.)
  (-> .getStylesheets (.add "some_style.css")))
Run Code Online (Sandbox Code Playgroud)

我正在使用Clojure,并且我没有在测试运行之间重新启动JVM.但是,我会为每次运行创建一个新的GUI实例.JavaFX在某处缓存样式表,因此编辑CSS文件无效.有没有办法强制JavaFX重新加载样式表?或者,重新加载类以便缓存丢失的方法?

icz*_*cza 2

请注意,您不是在设置更改样式表,而是添加样式表:

new Pane().getStylesheets().add("some_style.css")
Run Code Online (Sandbox Code Playgroud)

你调用add()方法!所以基本上是你Pane缓存了之前加载的样式表。

解决方案很简单:在再次加载之前,删除(清除)旧的:

Pane p = new Pane();
// Load first time:
p.getStylesheets().add("some_style.css");

// Later to reload:
p.getStylesheets().clear();
p.getStylesheets().add("some_style.css");
    // some_style.css will be read again and applied
Run Code Online (Sandbox Code Playgroud)

笔记:

如果您使用多个 CSS 文件,clear()这里可能不是您想要的。在这种情况下,clear()您可以使用该方法删除特定的样式表(您想要重新加载),remove()然后再重新添加它。

笔记2:

加载 CSS 文件时,应该使用资源的 URL,而不仅仅是文件名。如果仅提供文件名,则它还必须包含包名称。这样做既可以从文件系统也可以从 jar 文件运行:

p.getStylesheets().add(YourClass.class.getResource("some_style.css")
    .toExternalForm()); // if some_style.css is next to YourClass.java
Run Code Online (Sandbox Code Playgroud)