【问题标题】:Can I modify element values (colors) of a CSS file JavaFX programatically?我可以以编程方式修改 CSS 文件 JavaFX 的元素值(颜色)吗?
【发布时间】:2020-08-20 23:17:52
【问题描述】:

在我的 JavaFX 项目中,我允许用户设置将在整个应用程序中使用的强调色。此强调色将存储在 sqlite 数据库中。

初始化时,将读取数据库文件,并应用强调色。目前,这是通过在每个需要更改的元素上调用 .setStyle() 方法来完成的。这种方法容易出错且难以维护。我正在添加所有需要将更改应用于数组并循环遍历它的元素,但是每次添加新按钮时很容易忘记向数组添加元素等。更不用说不同类型的元素需要不同应用样式。

目前我能想到的唯一方法是将包括强调色在内的整个 CSS 元素存储为字符串,将字符串保存到文件系统上的 .css 文件中,然后加载外部 CSS。但是这种方法并不优雅。

所以我知道以下两种方法来完成我想要的,但都不是理想的。

  1. 在每个元素上调用 .setStyle(),将所有元素添加到数组并循环
  2. 将我的 CSS 存储在字符串中,保存到文件系统,加载 CSS,从文件系统中删除文件

诸如 less、sass 和 scss 之类的想法不会起作用,因为它们需要在构建时知道颜色是什么,而我不知道。提前准备单独的样式表是行不通的,因为用户可能会选择数百万种颜色。

一个理想的答案是修改 add() 方法以接受 css 规则作为字符串(类似于将它们传递给 .setStyle() 方法)而不是像这样的文件路径(例如,确实不工作):

primaryStage.getScene().getStylesheets().add("-fx-background-color:" + getAccentColor() + ";");

有什么想法吗?肯定有人以前提供过用户可配置的强调色。

谢谢!

【问题讨论】:

  • 这能回答你的问题吗? JavaFX CSS Dynamic Styling
  • 您也可以定义自己查找的颜色,然后通过调用setStyle(...)来更改它们的值
  • @James_D,嗨詹姆斯,我对你在另一个线程中的回答很感兴趣,但我不太明白如何实现它。具体来说,我不了解主题工厂/节点部分。我有一个父对象,它是节点的子类,但我没有直接有任何节点。请您帮我了解如何实现和使用 Theme 类?
  • @Hawk,基于这个问题,我认为它可能也回答了我的问题,但是当我的项目使用 SceneBuilder 以 FXML 构建时,我不明白如何实现它。我看到 James_D 也在这个线程中,希望你们中的一个可以帮助我调整答案以使用 FXML。任何帮助表示赞赏。
  • 只在根节点调用setStyle("-fx-base: "+getAccentColor()+";")有什么问题?

标签: java css javafx


【解决方案1】:

将所有节点存储在一个数组中并循环遍历它们是荒谬的。在链接的问题中,接受的答案以反应式编程的风格利用styleProperty。

另一个解决方案是使用 CSS 类并替换样式表,正如您所提到的。这将更像是一种生成方法。您可以在应用设置中下载样式的 DB 数据,设置样式,该样式仅定义特定 CSS 类的颜色,并在用户在运行时更改时重新加载。

因为无论如何您都会在启动时重写文件,所以您可以使用Files.createTempFile()。或者您仅在用户决定更改时更改它,这样您就可以保留文件。

【讨论】:

  • 我同意这很荒谬,因此提出了这个问题。当只有 3 个按钮的时候还不错,但是当我正在构建 UI 时,很明显它是不可维护的,并且没有很好地计划。
【解决方案2】:

这是我发现的答案,无需实现新类或覆盖 URL 处理程序或任何类似疯狂的东西即可完美运行。

How to override JavaFX css by code for complex objects

感谢@James_D!

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多