JavaFX之FXML+CSS创建窗体以及透明窗体添加阴影
前言
开通博客园有一段日子了,一直没空也没想好该写点什么。最近正好在做一个桌面程序,初次接触JavaFX,体验下来确实比swing好用不少。索性便记记学习笔记吧,虽然FX好像挺没存在感,没人用的感觉。本人技术有限,悟性不高,学得也很慢。不过 道阻且长,行则将至,写点笔记好日后待查,顺手练练Markdown了。可能不会那么系统,不过尽量详细。
本文目录
JavaFX窗体加载
传统方式
一般的,我们有:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class demo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane root = new BorderPane();//底层面板
Scene scene = new Scene(root,400,400);//设置窗体面板和大小
primaryStage.initStyle(StageStyle.DECORATED);//设置窗体样式
primaryStage.setTitle("Demo From"); //设置窗口标题
primaryStage.getIcons().add(null);//设置窗口图标
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
}
布局太基础了就不说了,对于窗体样式,有如下几个:
1、DECORATED——白色背景,带有最小化/最大化/关闭等有操作系统平台装饰( 默认)
2、UNDECORATED——白色背景,没有操作系统平台装饰
3、TRANSPARENT——透明背景,没有操作系统平台装饰
4、UTILITY——白色背景,只有关闭操作系统平台装饰
5、UNIFIED——有操作系统平台装饰,消除装饰和内容之间的边框,内容背景和边框背景一致
(对于窗体图标,代码中null代表一个Image对象,不展开说了)
FXML+CSS方式
除了传统方式,使用更多也更方便的是FXML+CSS方式,一般的,我们有:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class demo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader("FXML file path");
Parent root = fxmlLoader.load();
Scene scene = new Scene(root,400,400);//设置窗体面板和大小
primaryStage.initStyle(StageStyle.DECORATED);//设置窗体样式
primaryStage.setTitle("Demo From"); //设置窗口标题
primaryStage.getIcons().add(null);//设置窗口图标
primaryStage.setScene(scene);
primaryStage.getScene().getStylesheets().add("CSS file path");
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
}
在这种方式下,在FXML中为控件设置id,在css文件中使用id选择器即可设置不同的样式,用法大致上同于CSS3,主要差别和传统方式如何为控件设置样式参见下一段。
(伪代码不可直接运行)
透明窗体添加阴影
我们先来看看有阴影和无阴影窗体的差别:

(因博客为白色背景,所以图换成了灰色背景。同时为了方便对比无阴影下额外加了0.3的黑色边框,否则可能看不见)
这里值得注意的是,
1、JavaFX中CSS语法前面是必有“-fx-”否则不会生效,对于使用CSS文件加载也是一样
2、窗体阴影在使用“操作系统平台装饰”的stage样式时是默认自动生成的,无需自己设置,因此,自定义窗体阴影需要使用透明样式(TRANSPARENT)
3、透明窗体添加阴影必须使用
StackPane作为底层布局
传统方式下
对于传统方式下,我们有:
stage.initStyle(StageStyle.TRANSPARENT);
StackPane root = new StackPane();//底层面板
Scene scene = new Scene(root);
stackPane.setStyle(
"-fx-background-color: rgba(255, 255, 255, 1);" +
"-fx-effect: dropshadow(gaussian, black, 50, 0, 0, 0);" +
"-fx-background-insets: 50;"
);
scene.setFill(Color.TRANSPARENT);
stage.setScene(scene);
stage.show();
不难看出这里同样使用了CSS,只不过不是以文件方式加载,那么对于其他控件,同样可以使用setStyle()方法为其设置样式。
FXML+CSS方式下
其实两种方式大同小异,原理上一样。在此方式下,有:
代码部分
stage.initStyle(StageStyle.TRANSPARENT);
StackPane stackPane = new FXMLLoader("FXML file path").load();
Scene scene = new Scene(stackPane);
scene.setFill(Color.TRANSPARENT);
stage.setScene(scene);
stage.getScene().getStylesheets().add("CSS file path");
stage.show();
FXML部分
<StackPane xmlns="http://javafx.com/javafx"
fx:id="root"
xmlns:fx="http://javafx.com/fxml"
prefHeight="680.0" prefWidth="1000.0">
</StackPane>
CSS部分
.root{
-fx-background-color: rgba(255, 255, 255, 1);
-fx-effect: dropshadow(gaussian, black, 50, 0, 0, 0);
-fx-background-insets: 50;
}
这里不难看出FXML+CSS方式对于传统方式,本质上是拆分以做到更加简明。
需要注意的是,必须在FXML中设置id或者styleClass,css样式表才可以生效,并且很多属性,既可以在代码里设置,也可以在FXML或者css中设置,比如控件大小。
因此,两种方式完全可以混用,比如使用FXML加载布局,而后直接在代码中设置样式,又或者在代码中设置布局和id,加载css样式表文件,这一切均可以按照自己的需求来选择。
参考文章:https://blog.csdn.net/qq_32571359/article/details/72957307
(本文最后更新于2020.3.10,原创文章,转载请注明)
JavaFX之FXML+CSS创建窗体以及透明窗体添加阴影的更多相关文章
- JavaFx之不通过全局静态变量进行窗体通信
百度了n多窗体通信,,,总是通过定义全局静态变量进行传值通信..我个人不喜欢一个controller里写满所有的布局(这样显得臃肿,但是组件传值方便).有没有另外的办法进行模块化并且可以传值呢.. 肯 ...
- CSS创建三角形(小三角)的几种方法
你可以在很多地方看到三角形(小三角):tooltips提示框.下拉菜单.甚至在loading载入动画里.不管你喜欢还是不喜欢,这些小元素对各UI元素之间的联系关系式很重要的. 有一些不同的方法来设计并 ...
- qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good
qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个d ...
- 【转载】Layered Window(分层窗体,透明窗体)
本文转载自花间醉卧<Layered Window(分层窗体,透明窗体)> //为窗体添加WS_EX_LAYERED属性,该属性使窗体支持透明 ModifyStyleEx(0, WS_EX_ ...
- C#在透明窗体WinForm上面画图(电子尺小工具的实现)
前几天要做一个微信调一调的外挂,里面用到了尺子测量距离,然后就自己下载了一个电子尺,最近要升级我的跳一跳外挂,然后就准备自己做一个电子尺,嵌入到我的外挂里面,在嵌入到我的外挂之前,我自己做了一个完整版 ...
- PNG透明窗体全攻略(控件不透明)
http://blog.csdn.net/riklin/article/details/4417247 看好了,这是XP系统,未装.net.我的Photoshop学的不太好,把玻璃片弄的太透了些,如果 ...
- 纯 CSS 创建一个三角形
[要求]:用纯CSS创建一个三角形的原理是什么? ♪ 答: 把上.左.右三条边隐藏掉(颜色设为 transparent) [实现]: #demo { width: 0; height: 0; bord ...
- C# 制作透明窗体
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- gdi+ 高速绘制透明窗体
gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...
随机推荐
- UFT检查点
一.标准检查点 选择需要插入检查点的语句,点击右键,选择Insert Standard Checkpoint.... 二.图像检查点(Insert Standard Checkpoint....) 在 ...
- UFT安装
1.下载解压双击setup.exe 2.点击安装 3.点击下一步 4.检测是否需要安装插件之后一路向下 5.安装之后图标 下载: 链接:https://pan.baidu.com/s/1sa0h037 ...
- webstrom IDE 正则替换
ide:webstrom 其他IDE,可以自行测试. 目的. 将excel的table两列(一般是中文名,英文名,改为Javascript 对象) 从 场所内网IP地址 IP_ADDRESS 源外网I ...
- Django中查询相关操作
查询集特性 1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询. 2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个 ...
- JS一维数组、多维数组和对象的混合使用
转载地址:http://blog.csdn.net/wangyuchun_799/article/details/38460515 引言 这篇文章的主要目的是讲解JavaScript数组和对象的混合使 ...
- 吴裕雄--天生自然HTML学习笔记:HTML 框架
通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面. iframe语法: <iframe src="URL"></iframe> 该URL指向不同的网 ...
- PowerDesigner的文章
来自iteye的PowerDesigner的相关文章,写的不错,这里引用一下 PD12 建模工具的使用 博客分类: PowerDesigner .net http://jpkc.zjbti.net.c ...
- 吴裕雄--python学习笔记:sqlite3 模块的使用与学生信息管理系统
import sqlite3 cx = sqlite3.connect('E:\\student3.db') cx.execute( '''CREATE TABLE StudentTable( ID ...
- win10 安装VMware Workstation Pro提示无法在windows上运行
win10 安装vm无法在windows上运行 之前还可以用 网上搜了一下 要安装最新15.5.0就不会报错了 没毛病!! 不想注册下载 百度网盘(2019年9月19日版本) https://pan ...
- Jennifer Chayes: 生活始终在你手中
Jennifer Chayes 听到Mark Kac.Freeman J. Dyson.林家翘,或者是David I. Gottlie.BerndSturmfels和Sir John Ball等 ...