文档



JavaFX:使用JavaFX UI组件

37 使用CSS样式化UI控件

本主题介绍如何在JavaFX中使用层叠样式表(CSS)并为应用程序创建自定义外观。

样式表包含控制用户界面元素外观的样式定义。在JavaFX应用程序中使用CSS与在HTML中使用CSS类似。JavaFX CSS基于W3C CSS 2.1规范(可在http://www.w3.org/TR/CSS21/)上进行了一些扩展,并支持一些JavaFX特定功能的扩展。

使用JavaFX CSS为UI添加样式可以通过更改使用的样式表,将图37-1中显示的UI更改为图37-2中显示的UI。

图37-1 样式1

图37-1的描述
"图37-1 样式1"的描述

图37-2 样式2

图37-2的描述
"图37-2 样式2"的描述

默认样式表

JavaFX应用程序的默认样式表是modena.css,该文件位于JavaFX运行时JAR文件jfxrt.jar中。该样式表定义了根节点和UI控件的样式。要查看此文件,请转到安装Java开发工具包(JDK)的目录下的\jre\lib\ext目录。使用以下命令从JAR文件中提取样式表:

jar xf jfxrt.jar com/sun/javafx/scene/control/skin/modena/modena.css

图37-3显示了使用默认样式表的示例UI的外观。

图37-3 默认样式

图37-3的描述
"图37-3 默认样式"的描述

创建样式表

您可以创建一个或多个自己的样式表,以覆盖默认样式表中的样式并添加自己的样式。通常,您创建的样式表的扩展名为.css,并且位于与您的JavaFX应用程序的主类相同的目录中。

样式表controlStyle1.css提供了图37-1中显示的外观。样式表controlStyle2.css提供了图37-2中显示的外观。

样式表应用于Scene对象,如示例37-1所示,其中path是反映您样式表位置的目录结构,stylesheet是您样式表的名称。例如,图37-2的样式表的路径和名称为uicontrolcss/controlStyle2.css。

示例37-1 添加样式表

Scene scene = new Scene(new Group(), 500, 400);
scene.getStylesheets().add("path/stylesheet.css");

定义样式

样式定义由样式的名称(也称为选择器)和一系列设置样式属性的规则组成。定义的规则被包含在大括号({})中。示例37-2显示了名为.custom-button的样式的定义。

示例37-2 样式定义示例

.custom-button {
    -fx-font: 16px "Serif";
    -fx-padding: 10;
    -fx-background-color: #CCFF99;
}

注意:

字体的大小可以用点(pt)或像素(px)来指定。假设分辨率为96每英寸(dpi),所以1px = 0.75pt。

选择器

可以定义多种类型的样式。每种类型的样式都有自己的选择器约定。

样式类对应于类名。按照约定,由多个单词组成的样式类名之间使用连字符(-)分隔。样式类选择器前面加上一个点(.)。

样式类选择器的示例:

.button
.check-box
.scroll-bar

您还可以定义与节点关联的样式,通过节点的setId()方法设置ID。样式名称是以井号(#)开头的ID。例如,具有ID my-button的节点使用样式#my-button

ID样式选择器的示例:

#my-button
#shaded-hbox

还可以使用复合选择器。某些类包含可以有自己的样式定义的元素,称为后代类。这些定义由类的选择器和后代类的选择器之间用空格分隔。

后代类选择器的示例:

.check-box .label
.check-box .box
.radio-button .dot

伪类使您能够自定义节点的状态,例如当节点具有焦点时。这些定义由类的选择器和状态的名称之间用冒号(:)分隔。

伪类选择器的示例:

.radio-button:focused
.radio-button:hover
.scroll-bar:vertical

规则和属性

样式定义的规则为与类相关联的属性分配值。规则属性名称对应于类的属性名称。具有多个单词的属性名称的约定是用连字符(-)分隔单词。JavaFX样式表中的样式的属性名称前面加上-fx-。属性名称和值之间用冒号(:)分隔。规则以分号(;)结束。

规则的示例:

-fx-background-color: #333333;
-fx-text-fill: white;
-fx-alignment: CENTER;

.root样式类应用于Scene实例的根节点。因为场景图中的所有节点都是根节点的后代,所以可以将.root样式类中的样式应用于任何节点。

.root样式类包括其他样式可以使用的属性,以提供UI的一致性。例如,属性-fx-focused-base.root样式中定义。当其他UI控件具有焦点时,该属性用作控件的颜色。以下定义显示了如何在CheckBox类的样式中使用此属性:

.check-box:focused {
    -fx-color: -fx-focused-base;
}

场景的皮肤

通过自定义.root样式类,您可以快速改变UI的外观。两个示例样式表都设置了字体大小和字体系列,以及其他颜色派生的基本颜色和场景的背景颜色。 示例37-3显示了controlStyle2.css中的.root样式。

示例37-3 controlStyle2.css中的Root样式

.root{
    -fx-font-size: 16pt;
    -fx-font-family: "Courier New";
    -fx-base: rgb(132, 145, 47);
    -fx-background: rgb(225, 228, 203);
}

只需使用这个样式,您就可以创建图37-2中的基本外观。这是可能的,因为内置的UI控件使用为根节点设置的属性来派生自己的颜色和字体。

控件的皮肤

您可以通过为使用的不同控件定义样式来进一步自定义您的UI。您可以覆盖默认样式表中的定义,或创建新的类或ID样式。您还可以在代码中为节点定义样式。

覆盖默认样式

您可以通过在您的样式表中包含样式并为其分配不同的属性来覆盖默认样式表中的样式。 示例37-4显示了来自controlStyle2.cssButton类的样式。

示例37-4 覆盖样式

.button{
    -fx-text-fill: rgb(49, 89, 23);
    -fx-border-color: rgb(49, 89, 23);
    -fx-border-radius: 5;
    -fx-padding: 3 6 6 6;
}

字体颜色、边框颜色、边框半径和填充都从这个定义中获取。按钮的颜色和标签的字体样式从示例37-3中的.root定义中获取。使用这种样式的按钮如下图所示。

button_style2.png的描述
图示button_style2.png的描述

注意:

如果一个类在modena.css样式表中没有定义样式,请在您的样式表中定义样式,并将其分配给每个类实例,如示例37-6所示。例如,布局面板在modena.css样式表中没有定义样式。有关为诸如HBoxGridPane等类创建样式的信息,请参见使用CSS为布局面板设置样式

创建类样式

您可以通过在样式表中添加定义来创建类样式。在示例37-5中,controlStyle1.css定义了一个名为.button1的新样式。

示例37-5 定义一个新样式

.button1{
    -fx-text-fill: #006464;
    -fx-background-color: #DFB951;
    -fx-border-radius: 20;
    -fx-background-radius: 20;
    -fx-padding: 5;
}

任何添加了这个样式的按钮都会显示如下图所示。请注意,标签的字体是从controlStyle1.css中的.root定义中获取的。

button_style1.png的描述
图button_style1.png的描述

要将这个类样式分配给一个节点,使用getStyleClass().add()方法序列。在示例37-6中,展示了将.button1样式分配给Accept按钮的方法。

示例37-6 分配一个类样式

Button buttonAccept = new Button("Accept");
buttonAccept.getStyleClass().add("button1");

请注意,向节点添加样式是累积的。在将.button1样式类添加到buttonAccept节点之后,该节点将使用.button.button1样式的规则进行渲染。

创建ID样式

您可以通过创建样式并将样式分配给节点来为单个节点定义样式。样式名称是以井号(#)开头的ID。 示例37-7 创建了一个名为#font-button的样式定义。

示例37-7 定义一个ID样式

#font-button {
    -fx-font: bold italic 20pt "Arial";
    -fx-effect: dropshadow( one-pass-box , black , 8 , 0.0 , 2 , 0 );
}

分配了ID font-button 的按钮如下图所示。

button_style_id.png的描述
图示button_style_id.png的描述

示例37-8展示了如何将ID样式分配给节点。

示例37-8 分配ID样式

Button buttonFont = new Button("字体");
buttonFont.setId("font-button");

在代码中设置样式

您还可以选择在应用程序的代码中为节点设置样式属性。代码中设置的规则优先于样式表中的样式。 示例37-9展示了如何更改按钮的背景颜色和字体颜色。

示例37-9 内联定义样式

Button buttonColor = new Button("颜色");
buttonColor.setStyle("-fx-background-color: slateblue; -fx-text-fill: white;");

下图显示了按钮的外观。

button_style_inline.png的描述
图示button_style_inline.png的描述

其他资源

有关JavaFX样式表的更详细信息,请参阅JavaFX CSS参考指南

有关UI控件的样式,请参阅使用JavaFX UI控件

有关布局面板的样式,请参阅使用CSS样式化布局面板

有关图表的样式,请参阅使用CSS样式化图表

关闭窗口

目录

JavaFX:使用JavaFX UI组件

展开 折叠