java - 我可以在不重新启动 JVM 的情况下在 JavaFX 8 中重新加载样式表吗?

标签 java clojure javafx javafx-8

我使用的是 Java 1.8u25,并且我使用的是如下样式表(Java 和 Clojure 等效项)。

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

//Clojure
(doto (Pane.)
  (-> .getStylesheets (.add "some_style.css")))

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

最佳答案

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

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

你调用了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

注意:

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

注释 #2:

加载 CSS 文件时,您应该使用资源的 URL,而不仅仅是文件名。如果只提供文件名,它也必须包含包名。这样做既适用于文件系统也适用于 jar 文件:

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

关于java - 我可以在不重新启动 JVM 的情况下在 JavaFX 8 中重新加载样式表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26582157/

相关文章:

java - 检查memcached中是否存在 key (spymemchaced - Java memcached客户端)

java - 如何创建字符串枚举类型而不覆盖 Mule Studio 中使用的 toString 方法?

Java Comparable<T> 接口(interface)

clojure - 这个 Clojure 程序有什么问题?

java - 什么相当于 JavaFX 中的 JPanel

java - 如何通过 SWIG 处理从 C++ 到 Java 的异常

ruby-on-rails - 将 clojure 应用程序与 Ruby on Rails 应用程序相结合

clojure - Leiningen 有 "native dependencies"插件吗?

JavaFX css 样式不起作用 - 未知属性 + 未找到资源

java - 在 Java 中调试 - 设置 debugMode 标志