在我的javafx项目中,我允许用户设置将在整个应用程序中使用的强调色。此强调文字颜色将存储在sqlite数据库中。
初始化时,将读取数据库文件,并应用强调文字颜色。目前,通过对每个需要更改的元素调用.setstyle()方法来完成这项工作非常痛苦。这种方法容易出错,维护困难。我正在添加所有需要对数组应用更改的元素并在其中循环,但是每次添加新按钮等时都很容易忘记向数组添加元素。更不用说不同类型的元素需要应用不同的样式。
目前我认为实现这一点的唯一方法是将整个css元素(包括重音颜色)存储为字符串,将字符串保存到文件系统上的.css文件中,然后加载外部css。但这种方法并不优雅。
因此,我知道以下两种方法来实现我想要的,但都不是理想的。
对每个元素调用.setstyle(),将所有元素添加到数组并循环
将我的css存储在一个字符串中,保存到文件系统中,加载css,从文件系统中删除文件
像less、sass和scss这样的想法是行不通的,因为它们需要知道构建时的颜色,而我不知道。提前准备好单独的样式表是行不通的,因为用户可能会选择数以百万计的颜色。
理想的解决方法是修改add()方法,将css规则作为字符串接受(类似于将它们传递给.setstyle()方法的方式),而不仅仅是这样的文件路径(例如,不起作用): primaryStage.getScene().getStylesheets().add("-fx-background-color:" + getAccentColor() + ";");
有什么想法吗?肯定有人提供了用户可配置的口音颜色之前。
谢谢您!
2条答案
按热度按时间qmb5sa221#
将所有节点存储在一个数组中并在其上循环是荒谬的。在关联问题中,公认的答案利用了
styleProperty
以React式编程的方式。另一个解决方案是使用css类并交换样式表,正如您所提到的。这更像是一种生成性的方法。你可以在appsetup上下载样式的db数据,设置样式,它只定义特定css类的颜色,如果用户在运行时更改它,就可以重新加载它。
不管怎样,启动时都要重写文件,因此可以使用
Files.createTempFile()
. 或者只有在用户决定更改时才更改它,这样您就可以保留文件。swvgeqrz2#
这就是我发现的答案,它在不实现新类或覆盖url处理程序或其他类似疯狂的事情的情况下工作得非常完美。
如何通过代码覆盖复杂对象的javafxcss
感谢@james\u d!