JavaFX: 使用CSS选择器为应用程序添加样式

9
我有几个关于使用CSS选择器来样式化JavaFX应用程序的问题(例如:为每个TableView设置.table-view)。
我创建了一个主CSS文件,其中我想为我的应用程序定义通用的样式属性。例如:每个TableView在每个屏幕上都获得相同的颜色。我只需在与.fxml文件相关联的每个.css中导入Main.css。
现在我想以相同的方式样式化'sidebar'中的每个HBox。我已经尝试过这样做(如Oracle文档中建议的那样):
.sidebar > .hbox {
    /* Just some styling */
}

令我惊讶的是,这并没有起作用,但以下代码块是有效的:
.sidebar > HBox {
    /* Just some styling */
}

.sidebar HBox {
    /* Just some styling */
}

也许这与 .sidebar 是自定义样式有关,但我不确定。

所以我的问题是:

1. 为什么第一个不起作用?

2. 应该怎么做呢?(使用 .hboxHBox,以及 > 或无任何符号?)

1个回答

16
正如您在CSS文档中所看到的,HBOX类没有定义样式类。因此,您不能简单地使用.hbox http://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html#hbox 如果您只想查找工具栏的直接子项,则可以使用>符号。在CSS选择器中使用>符号将在性能问题上有一些好处,因为这样不需要扫描完整的工具栏控件下的子层次结构。匹配节点只会在第一级子代中搜索。
因此,如果您想选择所有作为侧边栏直接子项的按钮,可以执行以下操作:
. sidebar > .button

但是如果您真的想要为侧边栏中的所有按钮设置样式(即使它们被包含在面板中等),您需要使用以下选择器:

.sidebar .button

回到你的HBOX问题:即使HBOX没有定义样式类(.hbox),它也有一种可以用于类型选择器的类型。如CSS文档所述,所有节点都有一个类型:

Node的getTypeSelector方法返回一个字符串,类似于CSS类型选择器。默认情况下,此方法返回类的简单名称。请注意,内部类或匿名类的简单名称可能无法用作类型选择器。在这种情况下,应重写此方法以返回有意义的值。

因此,HBOX选择器起作用了。


3
这正是我在寻找的答案!这是我第一次看到这个信息(特别是关于直接子元素和使用>的部分)。奇怪的是,在某些书籍中我看到人们使用.hbox,但它并没有起作用。非常感谢您提供的答案! - bashoogzaad

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