GridPane,VBox,VBox的JavaFX CSS类

pau*_*l-g 4 javafx-8

JavaFX GridPane,VBox,HBox是否有预定义的CSS类?我在CSS参考中找不到任何内容,但是似乎很奇怪,默认组件没有定义。

如果没有预定义的类,那么有比在所有网格上手动添加类更好的方法:

GridPane pane = new GridPane();
pane.getStyleClass().add("grid-pane");
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 6

不,只有Control子类定义了默认的CSS类。我认为这是因为想要管理自己的图形(例如,使用Canvas或非托管Shapes)的应用程序可能不会使用CSS,但仍可能会使用这些布局窗格。由于css应用于场景图非常昂贵,因此不一定需要它们的节点就没有样式类。

我不认为除了显示的方式外,没有其他方法可以将样式类添加到窗格中。显然,如果您需要大量GridPane具有相同样式类的,则可以定义一个方法来避免重复代码:

private GridPane createGridPane() {
    GridPane grid = new GridPane();
    grid.getStyleClass().add("grid-pane");
    return grid ;
}
Run Code Online (Sandbox Code Playgroud)

更新资料

请注意,就像在基于HTML的CSS中一样,您可以使用基于类型的选择器以及基于样式类的选择器,如文档中所述。任何节点的默认样式类是其简单的类名。因此,您可以通过类型选择器选择网格窗格:

private GridPane createGridPane() {
    GridPane grid = new GridPane();
    grid.getStyleClass().add("grid-pane");
    return grid ;
}
Run Code Online (Sandbox Code Playgroud)

这对我来说有点脆弱:尤其是如果您子类化GridPane,则选择器将不再适用,这从面向对象的角度来看是非常违反直觉的。我建议在类型选择器上使用样式类。

另请注意,如果您想更改整个应用程序(或只是场景图的子图)的配色方案(这可能是最常见的用例),则可以简单地为某些标准外观定义值-颜色。例如:

GridPane {
    /* styles ... */
}
Run Code Online (Sandbox Code Playgroud)

将对整个应用程序应用“蓝色主题”,向所有子节点传播默认为“继承”的查找颜色和属性。

  • 不,我不确定应用 CSS 的成本有多高;有趣的是,CSS 开发人员似乎非常关心性能。我只是记得 OTN 上的[这个讨论](https://community.oracle.com/thread/3570580)。请注意,如果您使用控件(按钮、标签等),则无论如何都必须进行 CSS 传递。 (2认同)