Java FX 学习

news2024/9/22 20:23:08

声明:参考视频

一. Stage与Scene

在这里插入图片描述

  • 舞台与场景:JavaFX应用程序将Ul容器定义为舞台(Stage)与场景(Scene)Stage类是顶级容器,它对应于窗体,其内容由Scene决定。Scene类是所有可视化内容的容器(container),可以把它看成是一张画布,上面绘制了用户可以看到的内容。
  • Scene Graph 其实就是一颗多叉树,各种控件都是树中的节点。
  • 控件树的节点支持事件响应。
  • 最底层节点通常都是诸如按钮之类的控件也可以是Circle之类的图形。
  • 拥有子树节点称为容器,在JavaFX中成为“布局(Layout)”.
  • 这样做以后可以在窗口Stage中切换Scene从而实现随时切换页面,同时也可以新建Stage从而实现打开多个窗口。

二. Java FX MVC架构

在这里插入图片描述

  • 多窗体通信
    在这里插入图片描述

核心点:在MainClass初始化窗口时,将MainClass的引用传给相应窗口的控制器。之后在每个窗口的控制器中通过MainClass的引用完成从窗口的打开以及主从窗口的通信。
     在主窗口中打开新的窗口: 在MainClass初始化主窗口时,可以将MainClass的引用传给相应从窗口的控制器,然后在主窗口的控制器中通过MainClass的引用调用打开的窗口的函数,从而打开新的窗口。
    在从窗口中关闭从窗口: 在MainClass初始化从窗口时,将从窗口的stage传给从窗口的控制器,在从窗口的控制器中调用stage.close(),从而关闭从窗口。
    主窗口接收从窗口的信息:在MainClass初始化从窗口时,将主窗口的控制器的引用传给从窗口的控制器,在从窗口的控制器中调用主窗口控制器的相应方法,从而在主窗口中显示信息。
    从窗口接收主窗口的信息:在MainClass初始化从窗口时,将MainCLass的引用传给从窗口的控制器,在主窗口的控制器中通过MainCLass的引用的调用相应方法,从而在从窗口中显示信息。

demo下载

注意:在项目中加入资源时,将资源放在与包名同名的resources路径下,以此来方便使用资源文件。如下图所示在项目编译时,会将resources下的资源放到同名的包中。

在这里插入图片描述

三. 事件处理机制

  • 事件响应模式:
    • 传统的事件响应模式
    • Lamda事件响应模式
    • 声明式事件响应模式
//传统的事件响应模式
this.btn.setOnAction(new EventHandler<ActionEvent>() {
      @Override
    public void handle(ActionEvent actionEvent) {
        welcomeText.setText("Hello World!");
    }
    });
//Lamda事件响应模式
private void getRandomInt(ActionEvent actionEvent){
    Random random = new Random();
    int i = random.nextInt();
    welcomeText.setText(String.valueOf(i));
 }
this.btn2.setOnAction(this::getRandomInt);

// 声明式事件响应模式
//fxml文件中 onAction="#事件名" <Button fx:id="btn3" layoutX="229.0" layoutY="287.0" mnemonicParsing="false" onAction="#handleRandowm" text="声明式事件响应" />
@FXML
public void handleRandowm(ActionEvent actionEvent) {
   Random random = new Random();
   int i = random.nextInt();
   welcomeText.setText(String.valueOf(i));
   }
  • 事件派发链
    事件在控件树的传播流程成为事件派发连
    在这里插入图片描述

(1)事件派发链,实际上是一个双向链表,由事件目标对象负责创建。
(2)事件触发时,事件对象在链中传送
(3)事件响应方法(分为EventFilter和EventHandler两类)接收事件对象作为参数。

如下图所示,在这里插入图片描述

    //统一事件处理方法,输出event对象相关属性值
   //有参数决定是否消费此事件
   private void handleAndConsumd(Event event,boolean isConsumd,String msg) {
       if (isConsumd) {
           event.consume();
       }
       String info =String.format("Type:%s,source:%s,target:%s,consume:%s,msg:%s",
               event.getEventType(), event.getSource(),event.getTarget(),event.isConsumed(), msg);
       System.out.println(info);
   }

   void initListener(){
       borderpane.addEventFilter(MouseEvent.MOUSE_PRESSED,
               event -> handleAndConsumd(event, true, "borderpane filter mouse pressed"));
       borderpane.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "borderpane handler mouse pressed"));

       vbox.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "vbox filter mouse pressed"));
       vbox.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "vbox handler mouse pressed"));

       circle.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "circle filter mouse pressed"));
       circle.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "circle handler mouse pressed"));

   }
   @Override
   public void initialize(URL url, ResourceBundle resourceBundle) {
       initListener();

   }

三. JavaFX数据绑定机制及应用

  • JavaFX Bean Property: 包括get, set,以及property方法,JAVA FX Property具有动态监听property.addListner()和数据绑定property.bind()等特性。

  • JavaFX数据绑定的编程模式:
    在这里插入图片描述

  • 应用
    在这里插入图片描述
    分析:可以将变化的数据统一抽象为IntegerProperty,进行数据绑定,然后add 和sub只管更改IntergerProperty()(控件上有property属性的直接进行绑定,没有的话可以通过addListner()进行绑定)

    IntegerProperty integerProperty = new SimpleIntegerProperty(0);


    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        arc.setStartAngle(90);
        arc.setLength(-0);
		#绑定数据
        numLabel.textProperty().bind(integerProperty.asString());
        addBtn.disableProperty().bind(integerProperty.greaterThanOrEqualTo(100));
        subBtn.disableProperty().bind(integerProperty.lessThanOrEqualTo(0));

        integerProperty.addListener((observableValue, number, t1) -> {
            arc.setStartAngle(90);
            arc.setLength(-t1.intValue() * 3.6);
            bar.setProgress(t1.intValue() / 100.0);
        });
    }
    @FXML
    public void sub(ActionEvent actionEvent) {
        integerProperty.set(integerProperty.get() - 10);
    }
    @FXML
    public void add(ActionEvent actionEvent) {
        integerProperty.set(integerProperty.get() + 10);
    }

demo下载

四.Java FX实现MVVM架构

在这里插入图片描述

  • 业务逻辑代码单独抽离抽离出来,
  • view与ViewModel进行数据绑定
  • 控制器调用业务逻辑代码进行相应。
    demo下载

五.多线程

  • Runnable 对象

对于比较耗时的任务,需要使用多线程技术,但对UI控件的修改必须在JavaFX application thread中执行,因此可以使用 Platform.runLater() 推送到JavaFx application thread中执行修改UI控件的任务。

 Runnable task =()-> {
     try {
     	 //TODO: 执行耗时任务的代码
         Thread.sleep(1000);
         //Lambda表达式执行的任务,将会被推送到JavaFx application thread中执行
         //因此,里面可以有直接访问UI控件的代码
         Platform.runLater(()->{
           //TODO: 执行修改UI控件的代码
         });

        } catch (InterruptedException e) {
         // TODO Auto-generated catch block
           
        } };
  • Task对象(有返回值)里面封装了updateMessage(),updateProgress()修改UI控件的函数。

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

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

相关文章

运维监控体系实践与探索

在当今的数字化时代&#xff0c;运维工作作为企业IT服务的核心&#xff0c;面临着前所未有的挑战与机遇。随着业务规模的扩大和技术栈的复杂化&#xff0c;如何确保系统稳定运行、高效响应&#xff0c;成为运维团队亟需解决的问题。监控体系作为运维工作的基石&#xff0c;其建…

Python+selenium基于PO模式的Web自动化测试框架详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主…

分布式锁 分布式锁解决了什么问题 如何实现 看门狗机制是什么

分布式锁的基本概念 在 Redis 中实现分布式锁的常用方式是通过 SETNX 命令&#xff08;SET with NX option&#xff09;来设置一个键&#xff08;key&#xff09;&#xff0c;这个键代表锁。如果 key 不存在&#xff0c;SETNX 会设置成功&#xff0c;并返回 1&#xff0c;表示…

【LinuxPython】linux中通过源码方式安装python环境

python环境安装直接看第二部分即可。 文章目录 1.背景2.python安装3.包环境复制 1.背景 部署一个线上任务时&#xff0c;相同的代码本地开发机正常产出数据&#xff0c;线上产出数据为0&#xff0c;排查到原因是&#xff1a; ...File "/home/disk1/wangdeyong/venv/pyth…

linux搭建zabbix

zabbix简介 Zabbix是一个监控系统&#xff0c;它可以帮助我们实时检查设备的状态&#xff0c;比如服务器、网络设备等。当设备出现问题时&#xff0c;它会及时通知我们&#xff0c;让我们可以采取措施来解决。同时&#xff0c;它还可以把收集到的数据转化成图表和报告&#xf…

ITL-Internet Technology Letters

文章目录 一、期刊简介二、征稿信息三、投稿须知四、咨询 一、期刊简介 Internet Technology Letters本期旨在涵盖所有用于提高物联网性能的新兴或现代学习算法。在此背景下&#xff0c;我们打算收集有关物联网学习进展的研究论文。强烈鼓励与机器学习、计算智能、概率学习、统…

树和图()

预备知识&#xff08;可以不看&#xff09;&#xff1a; 无向图可以理解为是特殊的有向图 1. 图的遍历&#xff08;因为树可以理解为是特殊的图&#xff0c;因此这里不考虑树的遍历&#xff0c;只考虑图的遍历&#xff09; 给定一个具体的图&#xff0c;便于分析 下面是树的结构…

Servlet——个人笔记

Servlet——个人笔记 文章目录 [toc]Servlet简介Servlet命名Servlet由来实现过程 Servlet 相对 CGI 的优势简要说说什么是CGI Servlet 在IDEA中开发流程Servlet注解方式配置WebServlet注解源码WebServlet注解使用 Servlet常见容器Servlet 生命周期简介测试 Servlet 方法init()…

交叉编译util-linux

参考文章&#xff1a;https://www.cnblogs.com/wanglouxiaozi/p/17836701.html 1、下载源码 https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.39/2、编译 解压压缩包&#xff1a; sudo tar xvf util-linux-2.39.2.tar.gz执行autogen.sh生成configure ./aut…

解锁眼部舒压新境界:WT2605C-AT-L009眼部按摩仪蓝牙语音方案,手机APP控制,让护眼更轻松!

一、开发背景&#xff1a; 随着科技的飞速发展和人们生活品质的提升&#xff0c;眼部按摩仪作为一种能够缓解眼部疲劳、改善眼部血液循环的健康产品&#xff0c;越来越受到消费者的青睐。在众多眼部按摩仪中&#xff0c;采用WT2605C-AT-L009蓝牙模块的应用方案&#xff0c;不仅…

优思学院|PDCA和DMAIC之间如何选择?

在现代组织中&#xff0c;提升方法、质量和效率是企业追求卓越、保持竞争力的核心目标。在这条道路上&#xff0c;DMAIC&#xff08;定义、测量、分析、改进、控制&#xff09;和PDCA&#xff08;计划、执行、检查、行动&#xff09;被广泛应用于持续改进和问题解决。这两者虽然…

基于Java的大学新生入学系统设计与实现----附源码17610

摘要 随着高校规模的不断扩大和新生人数的增加&#xff0c;传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升大学新生入学迎新工作的效率和质量&#xff0c;本研究设计开发了一套基于Java的大学新生入学系统。系统通过信息技术的应用&#xff0c;集成了首页、校…

GIT IDEA 远程仓库操作

1、配置远程仓库地址 &#xff08;点击推送后如果没有配置远程仓库会让配置远程仓库&#xff09; 2、从远程仓库中下载项目到本地 3、提交->推送 更新代码&#xff08;拉取&#xff09;

PSTX250-600-70软启动器PSTX25060070面价

PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070说明书 PSTX250-600-70软启动器PSTX25060070接线图 PSTX250-600-70软启动器PSTX25060070引脚线 PSTX250-60…

配置错误和 IAM 弱点是云安全的主要隐患

根据云安全联盟发布的《2024 年云计算最大威胁》报告&#xff0c;通常与云服务提供商 (CSP) 相关的传统云安全问题的重要性正在持续下降。 配置错误、IAM 弱点和 API 风险仍然至关重要 这些发现延续了 2022 年报告中首次发现的轨迹&#xff0c;同时&#xff0c;诸如错误配置的…

第100+21步 ChatGPT学习:概率校准 Isotonic Regression

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

C语言中的结构体和位移段

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种用户自定义的数据类型&#xff0c;允许我们将不同类型的变量组合在一起&#xff0c;形成一个复合数据类型。结构体可以包含整型、浮点型、字符型等多种数据类型的成员。例如&#xff0c;我们可以定义一个表示人…

使用C语言构建Lua库

Lua 本身是用 C 语言编写的&#xff0c;因此使用 C 编写扩展可以更好地与 Lua 引擎集成&#xff0c;减少性能瓶颈&#xff0c;同时C 语言提供了对底层硬件和操作系统功能的直接访问能力&#xff0c;让 Lua 可以通过 C 扩展来实现对文件系统、网络等高级功能的支持。因为C 语言非…

The First项目报告:Web3人生模拟器,DegenReborn带你重开币圈

2023年6月14日&#xff0c;ReadON APP的首页上&#xff0c;一篇引人注目的文章《黑客马拉松奖&#xff1a;‘Degenreborn’——Meme与GameFi的梦幻交汇》跃然眼前&#xff0c;该文章巧妙融合了NFT、GameFi及Ethereum等热门话题&#xff0c;为读者带来了一场科技与娱乐的盛宴。 …

万字详述haproxy

目录 写在前面 1、Haproxy简介 2、Haproxy的安装和基本配置信息 2.1、haproxy的安装 2.2haproxy的基本配置信息 2.2.1基本配置文件global参数 2.2.2基本配置文件proxys的相关参数 2.2.2.1 default的相关参数 2.2.2.2 frontend的相关配置 2.2.2.3 backend的相关配置 …