前言

开通博客园有一段日子了,一直没空也没想好该写点什么。最近正好在做一个桌面程序,初次接触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. E丢丢App重设计总结

    E丢丢学习App是华夏大地教育可以有限公司旗下的一款产品,专为提升学历者打造,它整合了线上+跟踪的 (E平台)功能,方便工作人员随时随地管理账号.跟进学员:同时还可以随时了解教育行业的新闻资讯.一对一 ...

  2. Netflix拒上戛纳电影节,能给国内视频产业什么启示?

    当新事物诞生时,总是会遭到质疑,甚至是排斥!因为新事物的活力.潜力,都对保守的传统事物产生了极大的冲击.就像有声电影刚刚诞生时,一代"默片大师"卓别林就对其进行了激烈的反对.他认为 ...

  3. 快速搭建本地Nuget服务

    一  创建Nuget 服务项目 1.创建一个空白的asp.net web项目,需要.net 4.6以上 2.在Nuget中搜索 nuget.server ,可以看到是由 .Net 基金再维护的,几乎傻 ...

  4. 基于Springboot注解的策略模式

    释义 策略模式和多态很相似 可以理解为定义了一个统一的接口,有许多不同的实现类,可以自由选择不同的实时类去执行. 实现 上代码: 定义一个统一的接口: [JavaScript] 纯文本查看 复制代码 ...

  5. Android的HttpClient调用,冲突的解决办法

    只适用部分情况 题外话 攻关百度自动发贴作推广失败,但登录已拿下.全扔有点浪费. 在登录的基础上写了个百度的自动签到系统,功能已实现([java,android,nodejs,.net]+nodejs ...

  6. python django 模板语言循环字典

    urls.py from django.conf.urls import url from django.contrib import admin from cmdb import views url ...

  7. Spring+Struts2+Mybatis整合

    1. 创建项目 2. 添加Spring能力 使用MyEclipse自动加载Struts2和Spring的jar包和配置文件,并在web.xml文件中添加上下文和监听器 web.xml文件如下: < ...

  8. [BZOJ 3144][HNOI 2013] 切糕

    题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...

  9. 一些iOS面试基础题总结

    一些iOS面试基础题总结 目录 多线程 AutoLayout objc_msgSend Runtime 消息转发 Category NSObject 与 objc_class Runloop Auto ...

  10. 查漏补缺:进程间通信(IPC):管道

    管道是UNIX系统IPC的最古老形式,所有UNIX系统都提供此种通信机制.管道有以下两种局限性: (1)历史上,管道是半双工的(即数据只能在一个方向上流动). (2)管道只能在具有公共先祖的两个进程之 ...