内联JavaFX CSS在属性方面存在问题

f87krz0w  于 2023-06-25  发布在  Java
关注(0)|答案(1)|浏览(116)

我有一个LineChart,我想更改其-chart-plot-background属性的-fx-background-color。我想使用外部CSS文件(并且只通过代码,因为我希望能够动态更改属性)。不幸的是,以下几行无法正常工作:

linechart.setStyle("-chart-plot-background(-fx-background-color: red;)");

linechart.setStyle("-chart-plot-background{-fx-background-color: red;}");

错误内容如下:

Jun 21, 2023 7:04:17 PM javafx.css.CssParser parse
WARNING: CSS Error parsing '*{-chart-plot-background(-fx-background-color: red;)}: Expected RBRACE at [1,45]

Jun 21, 2023 7:04:17 PM javafx.css.CssParser parse
WARNING: CSS Error parsing '*{-chart-plot-background{-fx-background-color: red;}}: Expected RBRACE at [1,45]

我们如何解决这个问题?

fivyi3re

fivyi3re1#

传递给setStyle()的字符串应该是语法上有效的CSS规则,或者是由;分隔的规则集。您传递的文本语法不正确。
我想不使用外部CSS文件来实现它...因为我希望能够动态地更改属性
您可以使用外部CSS并使用“查找颜色”动态更改颜色(有关定义,请参阅文档)。简而言之,做到:

.chart {
    -plot-background-color: red;
}
.chart .chart-plot-background {
    -fx-background-color: -plot-background-color;
}

然后你可以动态地改变它

linechart.setStyle("-plot-background-color: blue;");

根据您的用例,自定义伪类也可能是合适的。这也允许您动态更改颜色以外的属性。对于您发布的具体示例:

.chart:alert .chart-plot-background {
    -fx-background-color: red;
}

然后在代码中你可以

private final PseudoClass alertPC = PseudoClass.getPseudoClass("alert");

// ...

linechart.pseudoClassStateChanged(alertPC, true); // will make background red

// ...

linechart.pseudoClassStateChanged(alertPC, false); // restores default background

正如一项评论所指出的,这两种方法都有局限性。“查找颜色”方法只能用于颜色(JavaFX CSS不支持其他类型的CSS变量),自定义CSS伪类只能用于一组离散的值。
作为最后的手段,对于不适合这两种情况的用例,您可以使用CSS查找。请注意,lookup(...)方法将返回null,除非已经进行了CSS传递,但由于您正在动态应用这些样式,因此这应该在您需要应用动态样式的时候发生。再举一个你引用的例子:

Node plotBackground = linechart.lookup(".chart-plot-background");
plotBackground.setStyle("-fx-background-color: red;");

如果由于任何原因,你需要在图表在场景图的自然生命周期中应用CSS之前执行此操作(这真的不应该发生;你的外部CSS(或只是系统默认值)可以定义初始/默认CSS状态,动态更改应该只在某些事件发生后调用,这应该是在组件显示后),你可以通过调用linechart.applyCSS();linechart.layout();强制应用CSS。

相关问题