前言

JavaFX 使用 CSS 文件来修饰 GUI 的外观,JavaFX 的 CSS 样式基于 W3C CSS 的 2.1 版本,JavaFX 的 CSS 语法和 HTML 的 CSS 语法一样。

CSS 语法

CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明。每条声明由一个属性和一个值组成。

selector {property: value}

举例如下

h1 {
-fx-color:red;
-fx-font-size:14px;
}

JavaFX 的选择器

1. 类型选择器(type selector)

类型选择器事实上是控件类选择器,针对每种控件,如 Button,Label 等。

  • 使用类型选择器,控制该类型控件的外观

  • 其对应的命名规则为将 JavaFX 的类名成首字母小写,如果是由多个单词拼接的类名,将每个单词原来大写的首字母小写然后用连字符将多个单词连接。

    JavaFX Class CSS type class
    Button button
    Label label
    CheckBox check-box
    TextField text-field

举例如下

.button {
-fx-background-color: blue;
}
2. 类选择器(class selector)

不针对单一控件,一个类选择器可以应用到多个控件。

  • 类选择器允许以一种独立于文档元素的方式来指定样式
  • 使用时必须指定每个实例的 styleClass 属性。才能使用这些选择器
  • 简单来说类型选择器针对类,类选择器针对实例

举例如下

.font-large {
-fx-font-size: 16pt;
}
3. ID选择器(id selector)

针对标有特定 id的控件

  • 一般情况下一个 ID 选择器对应这唯一的一个控件。

举例如下

#lbl-title {
-fx-font-color: red;
-fx-font-size: 20px;
-fx-font-weight: bolder;
}
4. 伪类选择器

针对控件的不同状态所定义的样式。如控件选择状态、点击状态、鼠标在控件上面等。

状态 描述
:disabled 表示元素被禁用的状态
:focused 表示元素获得了焦点的状态
:hover 表示鼠标悬停在元素上的状态
:pressed 表示元素被按下的状态

举例如下

.button:hover {
-fx-background-color: green;
}
5. 后代选择器

后代选择器(descendant selector)又称为包含选择器。

  • 后代选择器可以选择作为某元素后代的元素。
  • 如下例子表示选择h1 元素中的 em 元素

举例如下

h1 em {
-fx-color:red;
}
6. 子元素选择器

如果不希望选择任意的后代元素,而是希望缩小范围,只选择某个元素的子元素,请使用子元素选择器(Child selector)。

举例如下

只选择作为 h1 元素子元素的 strong 元素,可以这样写:

h1 > strong {
-fx-color:red;
}
7. 组合选择器

组合选择器可以同时选定多个选择器。所有的选择器分享相同的声明。用逗号将需要组合的选择器分开。

举例如下

VBox,Button {
-fx-background-color: lightgray;
}

属性声明的规则

命名规则是以 -fx 开头,然后连接该类的属性,属性名称的单词首字母小写,然后用连字符连接拼接的属性单词。

比如-fx-background-color对应着 Button 的 backgroundColor 属性

.button {
-fx-background-color: blue;
}

常用属性

.label {
-fx-background-color: blue;
-fx-font-size: 11pt;
-fx-font-family: "Segoe UI Semibold";
-fx-text-fill: white;
-fx-opacity: 0.6;
}

CSS文件 的使用

css 文件是指定给 JavaFX 的控件的。这个控件的所有子控件都能应用这个 CSS 文件。这个控件的父控件和平级控件不能应用。所以指定 css 文件事实上是给控件的Stylesheets属性赋值。

Scene 加载 CSS 文件
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
scene.getStylesheets().add(this.getClass().getResource("/css/style.css").toExternalForm());
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
3. JavaFX Scene Builder工具中指定 CSS 文件

选择控件后,在左边的Properties页面下指定即可

styleClass 属性赋值(使用类选择器)

1. 在代码使用设置 styleClass 属性
getStyleClass().add("font-large") //会自动应用css样式。。自动生效
2. 在 FXML 文件中设置 styleClass 属性
<!--单一styleClass属性-->
<GridPane styleClass="background"/>
<!--多个styleClass属性-->
<GridPane">
<styleClass>
<String fx:value="background" />
<String fx:value="label-bright" />
</styleClass>
</GridPane>
3. 在 JavaFX Scene Builder 工具中设置 styleClass 属性

id 属性(使用ID选择器)

1. 在代码中设置 id 属性
//只能指定单一ID
root.setID();
2. 在 FXML 中设置 id 属性
<GridPane id="aaa" />
3. 在 JavaFX Scene Builder 工具中设置 id 属性

style属性使用

1. 在代码中设置 style 属性
label.setStyle("-fx-font-size: 24px;");
2. 在 FXML 中设置 style 属性
<Button>
style="-fx-min-height: 30; -fx-min-width: 80;-fx-background-color: #337ab7;">
</Button>

注意:该属性完全可以用 css 文件和 id 选择器代替。

3. 在 JavaFX Scene Builder 工具中设置 style 属性

更换应用皮肤

通过切换 css 文件可以使用更换应用皮肤

primaryStage.getScene().getStylesheets().clear(); //清除后,会取消所有显示外观
File cssFile = new File("css/" + cssFilePath);
primaryStage.getScene().getStylesheets().add(cssFile.toURI().toString());//调用add方法后,会自动应用css

第三方外观框架

在实际开发中,可以使用现有的第三方开源框架来美化 JavaFX 应用。

这里推荐两个JavaFX CSS开源框架:

  • bootstrapfx (MIT协议)
  • jbootx (没有声明开源协议)。

Bootstrapfx 框架

官网地址:https://gitee.com/tju_xiaoyong/bootstrapfx/

BootstrapFX是一个开源项目,它将流行的前端框架 Bootstrap 与强大的 JavaFX 结合在一起,为Java开发者提供了一种更简洁、直观的方式来构建桌面应用程序。

通过这个项目,你可以利用Bootstrap的优美设计和响应式布局,打造具有现代感和跨平台兼容性的JavaFX应用。

使用步骤
  1. 导入 Bootstrapfx 依赖包

    <!-- BootstrapFX -->
    <dependency>
    <groupId>org.kordamp.bootstrapfx</groupId>
    <artifactId>bootstrapfx-core</artifactId>
    <version>0.4.0</version>
    </dependency>
  2. JavaFX 应用程序设置 BootstrapFX 样式

    scene.getStylesheets().add(BootstrapFX.bootstrapFXStylesheet());
  3. 在 FXML 文件中使用 BootstrapFX 样式

      <!-- Button 控件 -->
    <Button text="Submit" fx:id="submitButton" GridPane.columnIndex="4" GridPane.rowIndex="4"
    styleClass="btn-info"/>

JavaFX CSS 样式文件的更多相关文章

  1. Yii2 assets注册的css样式文件没有加载

    准备引入layui.css文件的,在LayuiAssets类中已经配置了资源属性 <?php namespace frontend\assets; use yii\web\AssetBundle ...

  2. 模板文件引入css样式文件

    引用路径问题:相对路径和绝对路径 相对路径:相对路口文件index.php设置 绝对路径:从虚拟主机站点目录开始设置 css样式文件引入图片,路径的设置 相对地址:相对css文件本身设置 ①模板文件 ...

  3. Django admin模块无法调用css样式文件

    在使用Django Admin开发时,发现admin模块css样式文件丢失,无法调用,使火狐浏览器提示: 此 URL 的资源不是文本: http://127.0.0.1:8000/statics/ad ...

  4. 动态为页面添加CSS样式文件引用

    动态为页面添加CSS样式文件引用: if (document.createStyleSheet) { //IE document.createStyleSheet("./Themes/Def ...

  5. wap开发使用jquery mobile之后页面不加载外部css样式文件/js文件

    场景: wap开发,使用jquery mobile之后不会加载外部自定义的css文件了,需要手动刷新才会加载,查看外部自定义的js文件也是一样. 解决办法: 1.在page下面添加css样式,就不要写 ...

  6. 关于Vue-cli 组件引入CSS样式文件

    在 Vue-cli 组件 .vue 文件中引入 css 样式表出错   由于使用Vue-cli后, 引入css 样式表 不需要 多余../../ 之类路径  现在写法也发生了改变 <style ...

  7. ASP.NET重写Render 加载CSS样式文件和JS文件(切换CSS换皮肤)

    网页换皮肤的方式有很多种,最简单的通常就是切换页面CSS,而CSS通常写在外部CSS文件里.那么切换CSS其实就是更换html里的link href路径.我在网上搜索了下. 一般有两种方式: 1.页面 ...

  8. css样式文件命名规范

    样式文件命名规范 主要 master.css, style.css, main.css 布局 layout.css 专栏 columns.css 文字 font.css 打印 print.css 主题 ...

  9. 解决下载的css样式文件在同一排的问题

    一.将样式文件里的所有内容复制到word里 Ctrl+F查找替换,将所有分号;替换成;^p 小提示:在word里^p表示回车 二.将央视文件里的所有反括号}进行替换替换成}^p然后将代码整个粘贴回样式 ...

  10. 网站引入了css样式文件能访问,就是没有效果

    今天后端的同事遇到这么个问题,引入了外部css文件也能访问,就是页面上没有效果. 大概是下面这个样子: css引入如下: 我非常的纳闷,说真的我还没遇到过这种情况,UI是可以运行的,一点事都没有... ...

随机推荐

  1. VS2019+CUDA12.5入门

    通常先装vs后装cuda,cuda会自动集成到vs中.而如果先装cuda,后装vs则需要进行额外的配置. 1 VS新建项目中增加CUDA选项 1.1 关闭vs2019(如果已经打开)1.2 检查CUD ...

  2. 数栈UI5.0设计实战|B端表单这样设计,不仅美观还提效

    表单是B端产品中最常见的组件之一,主要⽤于数据收集.校验和提交.比如登陆流程的账号密码填写,注册流程的邮箱.用户名等信息填写,都是表单应用的常见案例,在数栈产品中也是出现频率⾮常⾼的组件. 尽管表单应 ...

  3. .Net 9.0环境下WebApi发布到IIS

    一.在Visual Studio里发布 右键点击WebApi工程,点击发布按钮,如下图所示. 点击[发布]按钮后,系统弹出发布对话框,如下图所示. 选择文件夹,点击[下一步]. 在该界面选择发布输出的 ...

  4. jupyter notebook中使用pytorch

    jupyter notebook中使用pytorch 1.问题 在使用pytorch时,使用jupyter notebook无法调用,也没有可以调整更改的环境 错误提示:No module named ...

  5. Vue 结合Sortablejs实现table行排序

    场景 在一个列表展示页面上,使用了表格组件,原有组件本身不支持拖拽功能,需求要求在列表的基础上支持行拖拽排序.因此引入了Sortablejs插件. 问题及解决方案 引入Sortablejs后刚开始都很 ...

  6. pg 多列合并一列

    下面是正常的查询多条数据,如果我要合并成列怎么办.   其实pg有自带的array_to_string函数 ,但是写法稍微有点麻烦,但是可以根据array_to_string函数自定义一个函数去简化写 ...

  7. Solon AI & MCP v3.3.3 发布

    Solon AI Solon AI ,是 Solon 官方推出的 Java AI 应用开发框架.旨在为 Java 开发者提供统一的接口抽象层,简化与 OpenAI.DeepSeek.QWen 等主流 ...

  8. Python全栈应用开发利器Dash 3.x新版本介绍(3)

    更多Dash应用开发干货知识.案例,欢迎关注"玩转Dash"微信公众号 大家好我是费老师,在前两期文章中,我们针对Python生态中强大且灵活的全栈应用开发框架Dash,介绍了其3 ...

  9. 前端开发系列080-Node篇之cnpm

    本文输出Node中另一款包管理工具CNPM相关的内容,包括基本情况和简单使用. 一.简单介绍 CNPM是阿里的Node团队开发的一款NPM工具,由蚂蚁金服Node技术专家苏千(袁锋·Node技术专家) ...

  10. 远程创建的git仓库,第一次与本地仓库进行联动,需要强制推送。

    简介 远程创建的git仓库,第一次与本地仓库进行联动,需要强制推送. 参考链接 cnblog