JavaFX 2.2内置控件没有默认样式

时间:2015-04-21 16:06:26

标签: java css javafx

虽然CSS样式教程提到了默认样式表(caspian.css)和内置控件的默认类(比如.line for Line),但我的控件似乎缺少两者(由调试器检查)。

因此,如果我没有明确地设置它们的类,则不会对其他自定义CSS做出反应,这很烦人并且破坏了全局CSS样式的全部要点。

对于可能导致此类行为的任何想法,我将不胜感激。

1 个答案:

答案 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变为buttonComboBox变为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实例化时加载。这旨在作为不使用控件的场景图的性能增强(因此无论如何都不会从默认样式表中受益)。