我可以通过编程方式修改CSS文件JavaFX的元素值(颜色)吗?

我可以通过编程方式修改CSS文件JavaFX的元素值(颜色)吗?,java,css,javafx,Java,Css,Javafx,在我的JavaFX项目中,我允许用户设置整个应用程序使用的强调色。此强调色将存储在sqlite数据库中 初始化时,将读取数据库文件,并应用强调色。目前,通过对每个需要更改的元素调用.setStyle()方法,可以痛苦地完成这项工作。这种方法容易出错,难以维护。我正在添加所有需要对数组应用更改的元素并在其中循环,但每次添加新按钮等时,很容易忘记向数组添加元素。更不用说不同类型的元素需要应用不同的样式 目前我认为实现这一点的唯一方法是将整个CSS元素(包括重音颜色)存储为字符串,将字符串保存到文件系

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

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

目前我认为实现这一点的唯一方法是将整个CSS元素(包括重音颜色)存储为字符串,将字符串保存到文件系统上的.CSS文件中,然后加载外部CSS。但这种方法并不优雅

因此,我知道以下两种方法可以实现我的目标,但这两种方法都不理想

  • 对每个元素调用.setStyle(),将所有元素添加到数组并循环
  • 将我的CSS存储在字符串中,保存到文件系统,加载CSS,从文件系统中删除文件
  • 像less、sass和SCS这样的想法是行不通的,因为它们需要知道构建时的颜色,而我不知道。提前准备好单独的样式表是行不通的,因为用户可能会选择数百万种颜色

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

    primaryStage.getScene().getStylesheets().add(“-fx背景色:“+getAccentColor()+”;”)

    有什么想法吗?肯定有人以前提供过用户可配置的重音颜色


    谢谢大家!

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

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


    由于在启动时仍要重写文件,因此可以使用
    Files.createTempFile()
    。或者只有当用户决定更改时才更改它,这样您就可以保留该文件。

    我发现这是一个答案,它在不实现新类或覆盖URL处理程序或类似疯狂操作的情况下可以完美地工作


    感谢@James\u D

    这回答了你的问题吗?您也可以定义自己的查找颜色,然后通过调用
    setStyle(…)
    @James\u D,您好,James,我对您在另一个线程中的答案感兴趣,但我真的不知道如何实现它。具体来说,我不理解主题工厂/节点部分。我有一个父对象,它是node的子类,但我没有直接的节点。请您帮助我理解如何实现和使用主题类好吗?@Hawk,基于这个问题,我认为它可能也回答了我的问题,但我不理解当我的项目使用SceneBuilder在FXML中构建时如何实现它。我看到James_D也在这个帖子中,希望你们中的一位能够帮助我调整答案,使之适合使用FXML。非常感谢您的帮助。仅在根节点上调用
    setStyle(“-fx base:“+getAccentColor()+”;”)
    有什么不对?我同意这是荒谬的,因此提出了这个问题。当只有3个按钮时,情况并没有那么糟,但当我构建UI时,很明显,它不可维护,并且没有很好地规划。