controlsfx框架NotificationPane组件的使用

news2025/2/2 20:43:47

controlsfx 是javaFx开源UI框架,里面有很多默认组件的补充,最近在使用其中的NotificationPane组件时,遇到一些问题,记录下来。

官方demo链接:

https://github.com/controlsfx/controlsfx/blob/jdk-8/controlsfx-samples/src/main/java/org/controlsfx/samples/HelloNotificationPane.javahttps://github.com/controlsfx/controlsfx/blob/jdk-8/controlsfx-samples/src/main/java/org/controlsfx/samples/HelloNotificationPane.java

NotificationPane 是一个通知组件,效果如图:

controlsfx框架中还有一个通知组件是:Notifications,显示效果是从桌面边缘(8个方向)及中间弹出通知 (用法比较简单,就不多说了)。相比较于NotificationPane,NotificationPane更专注于当前操作,而Notifications适用于非重要的消息通知

这里按照官方的Demo做一个测试。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.SplitPane;
import javafx.stage.Stage;
import org.controlsfx.control.NotificationPane;


public class NotificationPaneTest1 extends Application {

    @Override
    public void start(Stage stage) {
        stage.setTitle("NotificationPaneTest1");
        SplitPane splitPane = new SplitPane();
        Button button = new Button("通知按钮");
        NotificationPane notificationPane = new NotificationPane();
        button.setOnAction(event -> {
            notificationPane.setText("这个是NotificationPane的通知");
            notificationPane.show();
        });
//        这里与NotificationPane notificationPane = new NotificationPane(button);效果一致,指定通知显示位置
        notificationPane.setContent(button);
        splitPane.getItems().add(notificationPane);
        Scene scene = new Scene(splitPane);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

实现效果如图:

由上面代码可以看出,notificationPane.setContent() 代码用来设置通知显示位置,并且显示的通知覆盖了定义的按钮组件。

那么如果不设置通知的显示位置会发生什么。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.SplitPane;
import javafx.stage.Stage;
import org.controlsfx.control.NotificationPane;


public class NotificationPaneTest2 extends Application {

    @Override
    public void start(Stage stage) {
        stage.setTitle("NotificationPaneTest2");
        SplitPane splitPane = new SplitPane();
        Button button = new Button("通知按钮");
        NotificationPane notificationPane = new NotificationPane();
        button.setOnAction(event -> {
            notificationPane.setText("这个是NotificationPane的通知");
            notificationPane.show();
        });
        splitPane.getItems().add(notificationPane);
        Scene scene = new Scene(splitPane);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

效果如图:

由图片发现,什么内容都没有,连定义的按钮组件都没有,经过仔细观察我们的组件并没有被SpliPane(根Node管理),那么我们让根节点管理我们的按钮组件,看会发生什么。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.SplitPane;
import javafx.stage.Stage;
import org.controlsfx.control.NotificationPane;


public class NotificationPaneTest3 extends Application {

    @Override
    public void start(Stage stage) {
        stage.setTitle("NotificationPaneTest3");
        SplitPane splitPane = new SplitPane();
        Button button = new Button("通知按钮");
        NotificationPane notificationPane = new NotificationPane();
        button.setOnAction(event -> {
            notificationPane.setText("这个是NotificationPane的通知");
            notificationPane.show();
        });

        splitPane.getItems().add(button);
        Scene scene = new Scene(splitPane);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

效果如图:

我们发现点击按钮不在有通知产生了。

 通过上面3处代码,及实验结果我们发现:

代码1:NotificationPane设置了通知显示位置,且根节点管理了NotificationPane,结果显示正常

代码2:NotificationPane未设置通知显示位置,且根节点管理了NotificationPane,结果什么都没有显示

代码3:NotificationPane未设置通知显示位置,而根节点管理了按钮组件,结果点击按钮无通知

此时我们知道,如果想要实现通知显示,必须满足两个条件:

1.定义通知显示位置

2.通知组件要被根节点管理

有了上面两个经验,我们看看下面的代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.controlsfx.control.NotificationPane;


public class NotificationPaneTest4 extends Application {

    @Override
    public void start(Stage stage) {
        stage.setTitle("NotificationPaneTest4");
        SplitPane splitPane = new SplitPane();
        Button button = new Button("通知按钮");
//        随便定义一个组件,只用来显示通知
        VBox vBox = new VBox();
        NotificationPane notificationPane = new NotificationPane(vBox);
        button.setOnAction(event -> {
            notificationPane.setText("这个是NotificationPane的通知");
            notificationPane.show();
        });

        splitPane.getItems().add(button);
        splitPane.getItems().add(notificationPane);
        Scene scene = new Scene(splitPane);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

效果如图:

这次我们的根节点,同时添加了按钮组件和NotificationPane通知组件,而通知组件则显示在一个空的VBox组件上,同样也实现了通知效果,虽然在我编写的代码里根节点并没有管理那个空的VBox,但是由于NotificationPane通知组件设置在了VBox上,我们也可以看到,实际上根节点也是添加了这个VBox,为了更直观的看到效果,我们对代码稍作改动。

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.controlsfx.control.NotificationPane;


public class NotificationPaneTest5 extends Application {

    @Override
    public void start(Stage stage) {
        stage.setTitle("NotificationPaneTest5");
        SplitPane splitPane = new SplitPane();
        Button button = new Button("通知按钮");
//        随便定义一个组件,只用来显示通知
        VBox vBox = new VBox();
        Label label = new Label("如果根节点未管理VBox,你就看不到我");
        vBox.setAlignment(Pos.CENTER);
        vBox.getChildren().add(label);
        NotificationPane notificationPane = new NotificationPane(vBox);
        button.setOnAction(event -> {
            notificationPane.setText("这个是NotificationPane的通知");
            notificationPane.show();
        });

        splitPane.getItems().add(button);
        splitPane.getItems().add(notificationPane);
        Scene scene = new Scene(splitPane);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

效果如图:

从图中我们可以看到确实如预想的那样,根节点确实管理了由NotificationPane设置的组件。

此时我们可以总结一下NotificationPane与其他Pane类似都是一个布局组件,区别在于NotificationPane不管理子组件的相对位置,方向等,可以理解为一个空白且透明的布局组件,在使用时,需要注意要设置NotificationPane的显示位置,同时要将NotificationPane交由相对的根节点管理。

这两个缺一不可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unittest接口自动化分享

一、环境搭建 1. Python安装 1. 1Python(3.6.8版本) 下载地址 https://www.python.org/downloads/release/python-368/ 1.1.1 Windows系统 1. 下载1. 对前缀的说明:​ 以Windows x86-64开头的是 64 位的 Python 安装程序;​ …

Ubuntu+Qt下配置车牌识别系统EasyPR1.6环境

1.将EasyPR_v1.6.zip拷贝到虚拟机Ubuntu中 最好是在opt文件夹中 ,可使用 VMware tools 共享文件夹 远程连接工具 2.解压得到EasyPR文件夹 修改文件权限 chmod -R 777 EasyPR 3.查找/opt/EasyPR/include/easypr/config.h中 这边告诉我们,如果open…

【RL数学基础】概率论的基本概念:随机变量、概率密度函数、期望、随机抽样

文章目录1.随机变量(Random Variable)2.概率密度函数(Probability Density Function, PDF)3.期望(Expectation)4.随机抽样(Random Sampling)1.随机变量(Random Variable&…

新一代免费开源大型企业数智制造解决方案

国家加速推进信创产业的开源自主可控 信创产业,即信息技术应用创新产业,其包含了从信息化基础设施到底层系统,再到上层的应用软件,与信息化建设过程中涉及有关的全产业链都必须安全与可控。信创产业涉及到的领域包括信息化基础设施…

编译安装nmon

nmon 是什么? nmon(Nigel’s performance Monitor for Linux)是一种Linux性能监视工具,当前它支持 Power/x86/x86_64/Mainframe/ARM 这五种 CPU 架构的 Linux,能将监控到的数据保存为 JSON 格式便于其他工具进行分析和…

【探索Spring底层】13.深入DispatcherServlet

文章目录1. DispatcherServlet概述2. DispatcherServlet的初始化时机3. DispatcherServlet初始化执行的操作4. RequestMappingHandlerMapping 基本用途5. RequestMappingHandlerAdapter 基本用途6. 参数和返回值解析器1. DispatcherServlet概述 DispatcherServlet是SpringMVC的…

AMS启动流程——APP启动过程

AMS流程图 基本慨念 1.zygote zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。 在Android系统里面,zygote是一个进程的名字。Android是基…

Effective C++(三):资源管理

个人读书记录,不适用教学内容。 目录 条款13:以对象管理资源 条款14:在资源管理类中小心copying行为 条款15:在资源管理类中提供对原始资源的访问 条款16:成对使用new和delete时要采取相同形式 条款17&#xff1a…

cubeIDE开发, STM32实时时钟(RTC)写入及读取日历时间开发要点

一、RTC简介 实时时钟的缩写是RTC(Real_Time Clock),核心是晶振,晶振频率一般为32768 Hz 。它为分频计数器提供精确的与低功耗的实基信号。它可以用于产生秒、分、时、日等信息。为了确保时钟长期的准确性,晶振必须正常工作,不能够…

中小企业的公司财务管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 本课题研究对象是中小企业财务管理系统,设计采用自己开发实践和所学知 识,系统部分主要分为以下…

【圣诞树代码】送她六棵圣诞树,祝她圣诞快乐~(送女朋友必备!)

“ 六棵圣诞树,满足她圣诞愿望 ” 距离25号圣诞节只有几天了,程序员有属于程序员的浪漫,这不来了~ 如果一颗圣诞树不够,那就送她六棵,祝她圣诞快乐~ 直接上效果图—— 01 02 03 04 05 06 代码如下: 第…

[1184]FinalShell下载安装

文章目录FinalShell介绍初步使用更换背景图连接记录删除FinalShell介绍 官网:http://www.hostbuf.com/ http://www.hostbuf.com/?install_fs FinalShell 简介: FinalShell 相当于 xshell ftp 的组合,即:FinalShell xshell f…

【计算机考研408】中断处理流程

中断请求 中断源是请求CPU中断的设备或事件,一台计算机允许有多个中断源。每个中断源向CPU发出中断请求的时间是随机的。 中断响应判优 中断响应优先级是指CPU响应中断请求的先后顺序。当多个中断源同时提出请求时,需通过中断判优逻辑来确定响应哪个中…

Python asyncore socket客户端开发基本使用

目录 介绍 1.定义类并且继承 asyncore.dispatcher 2.实现类中的回调代码 调用父类方法 创建 socket 对象 连接服务器 3.创建对象并且执行 asyncore.loop 进入运行循环 服务端示例代码 运行结果 注意: 介绍 asyncore库是python的一个标准库,提…

作为程序员,你离拿offer就差这个免费且好用的简历制作工具

为什么你的简历总是石沉大海?为什么你投递的岗位迟迟得不到回应?除了岗位招满、HR没看到以及竞争太激烈等客观因素外,最重要的是——“简历”出现了问题。 “简历”就像名片一样,在面试和求职的过程中,一份优质的简历…

数字孪生城市项目的关键技术展望

智慧城市是社会空间、物理空间和信息系统三元有机融合的条件下城市智慧化转型的新型态, 运用以数字孪生为代表的新一代信息化技术优化城市系统, 提升城市品质和综合竞争力, 从而实现可持续发展成为智慧城市构建的新趋势。 数字孪生城市项目的关键技术 北京智汇云舟科技有限公司…

chrome的几种存储storage模式

Storage生命周期存放数据大小与服务器通信localStore 除非被清除,否则永远保存 一般5MB 仅在客户端(即浏览器)中SessionStorage仅在当前会话下有效,关闭页面或者浏览器后被清除 一般5MB 保存,不参与和服务器的通信Cookies一般由服务器生成&a…

荣盛生物将再次上会:前三季度收入约2亿元,曾被暂缓审议

近日,上海证券交易所披露的信息显示,上海荣盛生物药业股份有限公司(下称“荣盛生物”)将于2022年12月26日接受科创板上市委员会的现场审议(即“上会”)。据贝多财经了解,荣盛生物曾于11月7月7日…

TCP滑动窗口、流量控制、拥塞控制

TCP滑动窗口、流量控制、拥塞控制一、滑动窗口二、流量控制三、拥塞控制一、滑动窗口 上篇博客我们介绍了TCP报文结构、确认应答机制、超时重传机制、连接管理机制。 TCP保证了可靠传输,但是失去了效率。那么怎么样尽可能提高传输效率呢??&a…

react笔记_07组件实例化对象的三大属性

目录前提状态(state)作用状态使用总结属性(props)展开运算符复习props-作为属性传入数据props-使用展开运算符展开对象props-进行数据类型限制propTypes语法校验规则举例说明defaultProps语法举例说明refs字符串形式的ref语法举例说明注意点回调形式的ref什么叫做回调&#xff…