【问题标题】:How do I dynamically add and remove css for the whole JavaFX application?如何为整个 JavaFX 应用程序动态添加和删除 css?
【发布时间】:2013-04-25 11:20:45
【问题描述】:

我正在使用JDK8 build 87,并希望动态添加和删除css stylesheets,以便我的整个JavaFX 应用程序都可以使用它们。

目前我正在使用此命令设置默认 styleSheet

Application.setUserAgentStylesheet(Application.STYLESHEET_MODENA);

然后当我想添加一个额外的 css 样式表时,我会这样做:

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

这可行,但我有两个问题。首先,它使用 private API,其次,一旦我完成它似乎没有办法删除它(我使用的是OSGI,所以它很常见模块来来去去)。

在 2012 年初,有人谈到将 StyleManager 转移到 public API,但我不确定这是否发生了任何事情。

有谁知道添加styleSheets 的公共方法,以便它们适用于整个JavaFX 应用程序?还有如何删除它们?

(我没有创建新javafx-8标签的权限)

【问题讨论】:

  • 添加了新标签,感谢您的建议。
  • 顺便说一句,如果您找不到合适的解决方案,您可以尝试在 javafx-jira bugtracker 上查找调整或 RFE,如果您找不到任何解决方案 - 提交您的调整 - 同时还不晚。。

标签: java javafx-2 javafx-8


【解决方案1】:

根据Global Stylesheet for your GUI application

// load default global stylesheet
Application.setUserAgentStylesheet(null);
// add custom global stylesheet
StyleManager.getInstance().addUserAgentStylesheet(AQUA_CSS_NAME);

但是,正如 Boomah 指出的那样,StyleManager.getInstance().addUserAgentStylesheet 不是 JavaFX API 的一部分,因此不建议直接从用户代码中使用此方法。此外,它仅适用于添加全局样式表,而不适用于添加样式表后删除此类样式表。


更喜欢冒险的人可以创建一个补丁来添加 Boomah 的建议功能,方法是修改 StyleManager 代码以支持删除全局样式表并修改 Application 类源代码以为新功能提供公共 API,该 API 利用更新了StyleManager,然后将补丁提交到openjfx-dev 以包含在JavaFX 平台中。


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

【讨论】:

  • 我很高兴将顶级样式表设置为 STYLESHEET_MODENA,如我上面的示例所示。 StyleManager 是私有 api,甚至无法在设置后删除其他样式表。
  • 正确,要获得您想要的功能,您需要提交补丁以实现该功能或create a feature request
  • 好的,我和 Jonathan Giles 谈过这个问题。他建议也添加到所有场景中。这不是一个大问题,因为我确实可以访问它们,只是似乎应该有更好的方法来做到这一点。谢谢
  • @Boomah StyleManager 似乎没有进入公共 9 api:bugs.openjdk.java.net/browse/JDK-8076423 - 所以即使在未来也没有干净的方式来全局添加样式(它会变得更糟,因为脏访问是不可能的)
  • @kleopatra 感谢您的提醒。如果这是唯一缺少的东西,我不会因为有解决方法而烦恼。我目前的烦恼是bugs.openjdk.java.net/browse/JDK-8087922 没有解决方法,它让任何JavaFX 应用程序都感觉很笨重。除了我之外没有人关心它:(
猜你喜欢
  • 2022-01-20
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2018-03-15
  • 2016-11-02
相关资源
最近更新 更多