虽然CSS样式教程提到了默认样式表(caspian.css)和内置控件的默认类(比如.line for Line),但我的控件似乎缺少两者(由调试器检查)。
因此,如果我没有明确地设置它们的类,则不会对其他自定义CSS做出反应,这很烦人并且破坏了全局CSS样式的全部要点。
对于可能导致此类行为的任何想法,我将不胜感激。
答案 0 :(得分:1)
在JavaFX中,支持三种CSS选择器,类似于标准CSS中的类型选择器,类选择器和ID选择器。对#34; class"这个词有点小心是很重要的,它在Java世界和CSS世界中有不同的含义:Java类是CSS类型;通过名为styleClass
的属性在节点上设置CSS类。
类型选择器由调用方法getTypeSelector
的结果决定,该方法在接口Styleable
中声明。 Node
实现此接口,并实现getTypeSelector
以返回
getClass()。getName()没有包名称
所以任何 Node
都可以通过指定其简单的类名来设置样式:
Label {
-fx-text-fill: green ;
}
Line {
-fx-stroke: red ;
}
等
CSS类由getStyleClass()
中的Styleable
方法确定,该方法返回字符串列表。 (请注意,节点可能有多个样式类,但我从未理解为什么这是List
而不是Set
。)默认情况下,此列表为空,但Control
子类已设置这个值通过他们的默认皮肤成为" css-ized"类名称的版本(Button
变为button
,ComboBox
变为combo-box
,等等。因此
.label {
-fx-text-fill: green ;
}
有效,但
.line {
-fx-stroke: red ;
}
如果没有先前设置样式类,将无效:
Line line = new Line();
line.getStyleClass().add("line");
最后,ID选择器通过在节点上指定id来工作。 Ids旨在在场景图中的所有节点中是唯一的。所以你可以做到
Line line = new Line();
line.setId("my-line");
与
#my-line {
-fx-stroke: red ;
}
因此,在您的示例中,默认情况下未设置样式类(Line
不是Control
子类)。您必须手动设置"#34;或使用类型选择器。
最后一点说明:你提到你的行"缺少caspian.css"。我不太清楚这意味着什么(因为Line
s根本没有被默认样式表设置样式),但默认样式表仅在第一次Control
实例化时加载。这旨在作为不使用控件的场景图的性能增强(因此无论如何都不会从默认样式表中受益)。