【问题标题】:How to set several default CSS stylesheet for an application with JavaFX 9 (a replace for StyleManager)?如何使用 JavaFX 9(StyleManager 的替代品)为应用程序设置几个默认 CSS 样式表?
【发布时间】:2018-04-26 17:22:43
【问题描述】:

谁该死的想法是在没有直接和明确的替换的情况下排除 StyleManager - 我看到它破坏了许多程序!

我需要对整个应用程序进行一些重新设计(自定义组件、自定义伪类、自定义平台特定补丁等)。 在 JavaFX 8 中,我可以使用:com.sun.javafx.css.StyleManager.getInstance().addUserAgentStylesheet("MyShit.css");

但在 Java 9 中 StyleManager 不可用。那么有没有办法为每个场景设置 CSS 呢?

使用“Application.setUserAgentStylesheet”不是一个选项,因为我不想失去默认的外观,我已经调用它来设置 MODENA 样式。我想扩展默认 CSS 而不是替换它。 而且我也不想重写整个 MODENA(显然)。

我真的不想为应用程序中的每个表单/场景手动设置相同的样式表(或将其添加到每个 FXML 文件中)。有许多形式,动态构造的对话框。主要原因是多个应用程序之间共享了一些部分(和库),所以我不想硬编码任何样式表(对于不同的应用程序可能有不同的名称和路径)。

所以我需要一种方法在程序的一个点为应用程序的每个可能场景设置一个额外的样式表。这在 FX9 中可能吗?

附:我研究了自定义 FXML 加载器、CSS 加载器、场景加载器和其他拦截场景创建的方法 - 没有办法!

【问题讨论】:

  • 我的意思并不是听起来无情,但 Java 的文档多年来一直在警告 com.sun.* 包使用不安全,因为它们最终会消失。在 Java 8 中,编译器甚至会发出警告。也许您可以为这些共享 UI 创建自己的(可能是静态的)属性?
  • 舒尔他们确实警告过,但他们没有任何替代方案。
  • 静态属性有什么用?对于 CSS 文件名?有几个共享的 GUI 组件和样式。我还修改了基本样式表等的一些样式。我不必将我的 CSS 的本地路径添加到所有 FXML 中,但它依赖于项目,依赖于表单位置,如果你在 FXML 中更改根组件,你会默默地丢失这个引用(因为它在根组件的标签中描述)。此外,我必须为自定义/修改对话框等添加许多加载器和 cinstruuctors。如果明天(实际上是今天)我不需要一个应用程序范围的 CSS,而是两个......而且这也是制作自定义皮肤的一种简单方法。跨度>

标签: java javafx fxml java-9 javafx-9


【解决方案1】:

这只是 JavaFX 的另一个不足 - 只需使用下面的 JVM 参数即可使 StyleManager 可访问。

--add-exports=javafx.graphics/com.sun.javafx.css=ALL-UNNAMED

【讨论】:

  • 这只是一个临时修复,在 JDK 9 之后将不再支持
  • 好吧,在 JavaFX 得到改进之前它将一直有效——这意味着 StyleManager 将被放置在一个公共包中。目前尚不清楚何时会。
  • 我不相信当前有一个路线图可以根据 JavaOne 详细说明的方向将其他任何内容放入公共包中
  • 解决问题的方法有两种。首先,创建一个名为 StyleManagerProxy 的类,其中定义方法 addUserAgentStylesheet,它只调用 StyleManager.getInstance().addUserAgentStylesheet()。使用提到的 JVM 参数编译它。并使用这个类。第二种方法是使用 Window().getWindows() 创建自己的管理器。该类将在添加/删除窗口时进行监听,您可以使用样式表修改它的场景。
猜你喜欢
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
相关资源
最近更新 更多