我查看了文档,但没有看到执行此操作的内置方法。 getStylesheets 是Parent 中唯一与样式表相关的方法,它只接受“链接到样式表的字符串 URL”,而不接受样式表本身。它返回一个泛型的ObservableList,所以它的返回值没有针对不同类型的特殊方法;只有一个通用的add。这与 getResource 返回 URL 和 toExternalForm() 仅返回该 URL 对象的 String 版本是一致的。
但是,您可以尝试一件事:data URI。不是将生成的 URI 传递给样式表文件,而是传递一个数据 URI,其内容是该样式表。不过,我不知道 API 是否会接受这种 URI,因为 getStylesheets 的文档中链接的 CSS Reference Guide 说
样式表 URL 可以是绝对 URL 或相对 URL。
首先尝试一个非常简单的数据 URI,看看它是否有效。您可以使用this online tool 生成一个。如果 Java 确实接受数据 URI,那么您只需要使用一些将字符串转换为数据 URI 的方法调用来包装包含 CSS 的字符串,如下所示:
pane.getStylesheets().add(new DataURI(
".button:ok { -fx-background-color: green; }\n"+
".button:ko { -fx-background-color: red; }").toString());
DataURI 类是假设的。如果 JavaFX 接受手动生成的数据 URI,那么您必须自己找到一个提供该 DataURI 类的库;我确定某个地方存在。
还有一种方法可以将某个Node 的内联CSS 指定为String,这几乎就是您要找的。在CSS Reference Guide中提到:
CSS 样式可以来自样式表或内联样式。样式表从 Scene 对象的 stylesheets 变量中指定的 URL 加载。如果场景图包含控件,则加载默认的用户代理样式表。内联样式通过 Node setStyle API 指定。内联样式类似于 HTML 元素的 style="…" 属性。
但是,听起来它不支持 CSS 中的选择器,只支持规则 - 所以不要说 .red { color: red; },你只能写 color: red;,它适用于 @987654350 的所有子代@。这听起来不像你想要的。所以数据 URI 是你唯一的希望。
编辑:虽然这是一个聪明的想法(我以前不知道数据 URI),但它不起作用。我有同样的要求,所以我尝试了。它不会引发异常,但日志中有警告并且未应用样式:
我用过这种风格:
.root{
-fx-font-family: "Muli";
-fx-font-weight: lighter;
-fx-font-size: 35pt;
-fx-padding: 0;
-fx-spacing: 0;
}
并使用提供的工具生成以下数据 URI:
data:text/css;charset=utf-8,.root%7B%0D%0A%20%20%20%20-fx-font-family%3A%20%22Muli%22%3B%0D%0A%20%20%20%20-fx-font-weight%3A%20lighter%3B%0D%0A%20%20%20%20-fx-font-size%3A%2035pt%3B%0D%0A%20%20%20%20-fx-padding%3A%200%3B%0D%0A%20%20%20%20-fx-spacing%3A%200%3B%0D%0A%7D
将它应用到我的场景中:
scene.getStylesheets().add("data:text/css;charset=utf-8,.root%7B%0D%0A%20%20%20%20-fx-font-family%3A%20%22Muli%22%3B%0D%0A%20%20%20%20-fx-font-weight%3A%20lighter%3B%0D%0A%20%20%20%20-fx-font-size%3A%2035pt%3B%0D%0A%20%20%20%20-fx-padding%3A%200%3B%0D%0A%20%20%20%20-fx-spacing%3A%200%3B%0D%0A%7D");
结果(请原谅我的法语,AVERTISSEMENT=WARNING):
janv. 07, 2015 12:02:03 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
AVERTISSEMENT: Resource "data:text/css;charset=utf-8,%23header%7B%0D%0A%20%20%20%20-fx-background-color%3A%23002D27%3B%0D%0A%20%20%20%20-fx-font-size%3A%2035pt%3B%0D%0A%20%20%20%20-fx-text-fill%3A%20%23fff%3B%0D%0A%7D" not found.
很遗憾,JavaFX 似乎不知道数据 URI。