如何动态地为整个JavaFX应用程序添加和删除CSS?

8
我正在使用JDK8 build 87,并希望动态添加和删除CSS样式表,以便它们可以被整个JavaFX应用程序使用。目前,我正在使用以下命令设置默认的styleSheet:
Application.setUserAgentStylesheet(Application.STYLESHEET_MODENA);

当我想添加额外的CSS样式表时,我会这样做:

com.sun.javafx.css.StyleManager.getInstance.addUserAgentStylesheet(styleSheet);

这个方案可行,但存在两个问题。首先,它使用了一个私有 API;其次,似乎没有办法在使用完毕后将其删除(我使用 OSGI,因此模块的出现和消失很常见)。
在 2012 年初,有关将 StyleManager 移动到公共 API 的讨论,但我不确定是否已经有所进展。
是否有任何公共方法可以添加 styleSheets,以便它们适用于整个 JavaFX 应用程序?另外,如何移除这些 styleSheets?
(我没有创建新的 javafx-8 标签的特权)。

顺便提一下,如果你找不到合适的解决方案,可以尝试在javafx-jira错误跟踪器上查找tweak或RFE,如果找不到任何一个 - 在还来得及的时候提交你的tweak。 - Alexander Kirov
1个回答

4
根据GUI应用的全局样式表
// load default global stylesheet
Application.setUserAgentStylesheet(null);
// add custom global stylesheet
StyleManager.getInstance().addUserAgentStylesheet(AQUA_CSS_NAME);

然而,正如Boomah指出的那样,StyleManager.getInstance().addUserAgentStylesheet不是JavaFX API的一部分,因此不建议直接从用户代码中使用此方法。此外,它仅适用于添加全局样式表,而不能删除已添加样式表。
更具冒险精神的人可以创建一个补丁,通过修改StyleManager代码以支持删除全局样式表并修改Application类源代码以提供新特性的公共API,该特性使用更新的StyleManager,然后将补丁提交给openjfx-dev,以便包含在JavaFX平台中。

与此同时,您可以在每个应用程序场景中手动设置用户样式表 - 有点麻烦,但是这就是现实...


我很高兴将顶级样式表设置为STYLESHEET_MODENA,就像我上面的示例一样。StyleManager是私有API,即使它也没有能力在设置后删除其他样式表。 - Boomah
要实现您想要的功能,您需要提交一个补丁来实现该功能或创建一个功能请求 - jewelsea
好的,我已经和Jonathan Giles谈过了。他建议在所有场景上添加。这不是一个很大的问题,因为我可以访问它们所有,只是似乎应该有更好的方法来解决这个问题。谢谢。 - Boomah
2
@Boomah StyleManager似乎没有进入公共9 API:https://bugs.openjdk.java.net/browse/JDK-8076423 - 因此,即使在未来,也没有一种干净的方式可以全局添加样式(情况会变得更糟,因为脏访问将不可能)。 - kleopatra
@kleopatra 感谢你的提醒。如果那是唯一缺失的东西,我就不会那么烦恼了,因为有一个解决方法。我目前的烦恼是 https://bugs.openjdk.java.net/browse/JDK-8087922 ,没有解决方法,这使得任何JavaFX应用程序都感觉很笨重。除了我之外,似乎没有人关心它 :( - Boomah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接