如何在Javafx中不将CSS样式应用于标签(Label)?

4

在我的Java GUI中,我有大约50个标签。它们都将使用CSS样式进行格式化。但是其中有5个标签,我想使用诸如ColorPicker之类的工具来更改它们的字体颜色:

Color ch = lineCommentColorPicker.getValue();
if (ch != null) {
    lineCommentColorLabel.setTextFill(ch);
}

我的问题是,我怎么才能避免使用setTextFill方法设置的颜色被定义为“.label”类的CSS样式规则再次覆盖。

.label {
    -fx-text-fill: black;
    -fx-font-weight: bold;
    -fx-font-size: 12;
}
2个回答

8
您可以使用以下方法完全删除标签样式:
lineCommentColorLabel.getStyleClass().remove("label");

并应用适当的样式。或者,您可以向除了希望手动着色的标签之外的其他标签添加样式类,例如:

.myclass
{
    -fx-text-fill: red;
}

并且

lineCommentColorLabel.getStyleClass().add("myclass");

3

背景信息

JavaFX CSS参考指南中,有一些关于偏好设置的信息:

来自用户代理样式表的样式比代码设置的值优先级低,场景或父级样式表的优先级也低于代码设置的值。内联样式具有最高的优先级。父级实例的样式表被认为比场景样式表的那些样式更具体。

还要注意,应用程序只有一个用户代理样式表,通常是JavaFX的内置标准样式表(例如JavaFX 8的modena.css)。通常情况下,应用程序不会覆盖此样式表。

因此,设置标签文本填充的场景样式表将优先于设置标签文本填充的内联代码 - 并且每当内部JavaFX实现决定将CSS应用于场景图时,CSS规则将生效。

潜在解决方案

绑定

绕过此问题的一种方法是使用以下语句:

customizedLabel.textFillProperty().bind(colorPicker.valueProperty());

这是因为绑定值不能被设置。一旦你进行了绑定,CSS 实现就不能将标签填充重置为另一个值。
请注意您的样式规则。
另一种处理方式是确保您不在场景样式表中设置 -fx-text-fill,以便在代码中自定义文本填充的标签。这本质上是 Roland 的“myclass”或删除“label”样式类解决方案。
修改用户代理样式表
您还可以复制标准 JavaFX 样式表,直接对其进行修改,并使用 setUserAgentStylesheet 将其设置在应用程序中,然后您可以在代码中覆盖用户代理样式表所做的任何 CSS 设置。我只会考虑这点,如果您部署到受控的 JavaFX 运行时(例如作为自包含应用程序部署),并且可以在更新运行时时合并用户代理样式表中的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接