前言

开通博客园有一段日子了,一直没空也没想好该写点什么。最近正好在做一个桌面程序,初次接触JavaFX,体验下来确实比swing好用不少。索性便记记学习笔记吧,虽然FX好像挺没存在感,没人用的感觉。本人技术有限,悟性不高,学得也很慢。不过 道阻且长,行则将至,写点笔记好日后待查,顺手练练Markdown了。可能不会那么系统,不过尽量详细。

本文目录

1. JavaFX窗体加载

 1.1 传统方式

 1.1 FXML+CSS

2. 透明窗体添加阴影

 2.1 传统方式下

 2.1 FXML+CSS方式下


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创建窗体以及透明窗体添加阴影的更多相关文章

  1. JavaFx之不通过全局静态变量进行窗体通信

    百度了n多窗体通信,,,总是通过定义全局静态变量进行传值通信..我个人不喜欢一个controller里写满所有的布局(这样显得臃肿,但是组件传值方便).有没有另外的办法进行模块化并且可以传值呢.. 肯 ...

  2. CSS创建三角形(小三角)的几种方法

    你可以在很多地方看到三角形(小三角):tooltips提示框.下拉菜单.甚至在loading载入动画里.不管你喜欢还是不喜欢,这些小元素对各UI元素之间的联系关系式很重要的. 有一些不同的方法来设计并 ...

  3. qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good

    qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个d ...

  4. 【转载】Layered Window(分层窗体,透明窗体)

    本文转载自花间醉卧<Layered Window(分层窗体,透明窗体)> //为窗体添加WS_EX_LAYERED属性,该属性使窗体支持透明 ModifyStyleEx(0, WS_EX_ ...

  5. C#在透明窗体WinForm上面画图(电子尺小工具的实现)

    前几天要做一个微信调一调的外挂,里面用到了尺子测量距离,然后就自己下载了一个电子尺,最近要升级我的跳一跳外挂,然后就准备自己做一个电子尺,嵌入到我的外挂里面,在嵌入到我的外挂之前,我自己做了一个完整版 ...

  6. PNG透明窗体全攻略(控件不透明)

    http://blog.csdn.net/riklin/article/details/4417247 看好了,这是XP系统,未装.net.我的Photoshop学的不太好,把玻璃片弄的太透了些,如果 ...

  7. 纯 CSS 创建一个三角形

    [要求]:用纯CSS创建一个三角形的原理是什么? ♪ 答: 把上.左.右三条边隐藏掉(颜色设为 transparent) [实现]: #demo { width: 0; height: 0; bord ...

  8. C# 制作透明窗体

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. gdi+ 高速绘制透明窗体

    gdi+ 高速绘制透明窗体: 方法一: 1.用Iamge对象载入png资源, 2.调用drawimage函数讲图片绘制出了 3.UpdateLayeredWindow对窗体进行布局 方法二: 1.用B ...

随机推荐

  1. django框架进阶-ModelForm组件-长期维护

    ############################################################ """ 通常在Django项目中,我们编写的大部 ...

  2. 林轩田机器学习基石课程学习笔记5 — Training versus Testing

    上节课,我们主要介绍了机器学习的可行性.首先,由NFL定理可知,机器学习貌似是不可行的.但是,随后引入了统计学知识,如果样本数据足够大,且hypothesis个数有限,那么机器学习一般就是可行的.本节 ...

  3. perf4j+logback配置 非spring 可使用注解

    最近项目打算使用perf4j进行性能监控,由于项目没有使用spring,而又不想对代码入侵过高,打算使用注解的方式进行接入.perf4j采用AspectJ库实现AOP. 具体接入方法如下: logba ...

  4. CF-544:部分题目总结

    -------------------昨天打的重现赛,感觉是我打的发挥的最好的一场比赛了,六题都一次AC.那么就来总结一下吧 题目链接:http://codeforces.com/contest/11 ...

  5. vue项目中net::ERR_CONNECTION_TIMED_OUT错误

    我出错的原因时network地址与我本机ip地址不一致 Network: http://192.168.13.30:8080/ 处理方法: 在vue项目中新建一个vue.config.js文件 配置上 ...

  6. cs231n spring 2017 lecture2 Image Classification

    1. 相比于传统的人工提取特征(边.角等),深度学习是一种Data-Driven Approach.深度学习有统一的框架,喂不同的数据集,可以训练识别不同的物体.而人工提取特征的方式很脆弱,换一个物体 ...

  7. [LC] 295. Find Median from Data Stream

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  8. Eclipse中项目过大引起的 IDE 加载缓慢,JVM 内存不足的情况解决

    如果 IDE 加载项目非常缓慢,甚至常常出现卡死的情况,有可能是开发工具设置的 JVM 内存不够引起的.解决办法:找到 Eclipse 的安装目录,修改 Eclipse.ini 配置文件.修改此配置文 ...

  9. java中Redis5大基本类型的用法

    存储格式 基本用法 通过Jedis(封装了redis的Java客户端)对redis进行操作. Jedis工具类 public class JedisPoolUtil { private static ...

  10. C# 开启线程的几种方式

    1.异步委托开启线程 public static void Main(string[] args) { Action<int,int> a=add; a.BeginInvoke(,,nul ...