【发布时间】:2020-08-20 23:17:52
【问题描述】:
在我的 JavaFX 项目中,我允许用户设置将在整个应用程序中使用的强调色。此强调色将存储在 sqlite 数据库中。
初始化时,将读取数据库文件,并应用强调色。目前,这是通过在每个需要更改的元素上调用 .setStyle() 方法来完成的。这种方法容易出错且难以维护。我正在添加所有需要将更改应用于数组并循环遍历它的元素,但是每次添加新按钮时很容易忘记向数组添加元素等。更不用说不同类型的元素需要不同应用样式。
目前我能想到的唯一方法是将包括强调色在内的整个 CSS 元素存储为字符串,将字符串保存到文件系统上的 .css 文件中,然后加载外部 CSS。但是这种方法并不优雅。
所以我知道以下两种方法来完成我想要的,但都不是理想的。
- 在每个元素上调用 .setStyle(),将所有元素添加到数组并循环
- 将我的 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()+";")有什么问题?