javaFX + MVVM桌面应用开发的解决方案

项目背景

应用场景:项目是软工大作业要求做一个桌面应用。当时开发时直接奔着需求就开写了,没有统一好设计,于是乎组内几个同学写的代码八仙过海各显神通,高度耦合且不说,相互之间阅读起来非常费劲,每次有谁遇到一个bug其他几人得先花好久学习他的代码逻辑。于是在第一轮迭代的过程中我自己整理了一套框架,或者说规范,来改善团队的开发效率。本篇主要用于记录和介绍框架的设计思路和使用方法。

一点野史:我设计这套规范的初衷主要是为了统一组内页面跳转数据交互的代码风格,最开始就只是封装了utils里的几个工具类。结果写完盯着目录和javafx文档感觉文思泉涌,第二天花了一天奔着解耦为目的把代码结构重构了一遍,发现效果不错,信心爆棚,于是厚颜无耻的跟组员说我想出了一套“框架”。

设计思路

MVVM

首先开门见山,这套规范的骨架采用了MVVM的思想,简单来说就是在传统MVC的基础上,解耦了VC里的部分业务,形成了一个专门为View层处理与后台进行数据交互业务的View-Model层,并通过绑定把数据动态更新到View层。本项目使用javafx提供的property属性,实现了VM和V层的双向绑定,使交互得到的最新数据自动展示到了V层。虽然会多写一个层多一点代码,但这种结构就很清爽,对于团队开发,以及我这种轻度代码洁癖患者可以说是非常友好了。

使用VM层来管理数据交互的另一个好处是减少同一份数据在多个页面来回的传输。举个例子,我想要我的APP每一个页面右上角都出现用户的头像,姓名,年龄...一组信息。以前MVC的解决思路是在每次跳转到新页面时1.重新从后台请求一次用户信息2.从上一个页面把信息传过来,或是使用session/cookie;MVVM中由于V层和VM层之间通过绑定来同步数据,那么同一个VM类维护的数据可以同步到多个V层页面,省去了每个页面中相同的传数据的代码。

注:在这个项目中,我对VM层的理解是:一个VM实现类负责一组抽象的业务(如维护一套用户信息),它不一定要和后端Entity一对一,也不一定和页面一对一,而是根据具体业务情况实现单例复用

MVVM
MVVM的结构长这样

在本项目的设计中,如果进一步来看,三层里面各自又可以分为若干层

本项目的基本结构

从右向左看:

Model层

Model层只负责数据持久化,内部结构同MVC

本项目由于老师要求不联网,因此就免去了controller层和service层(紫色部分),ViewModel层直接调用DAO层获取数据(绿色笔画的部分标识具体代码中的调用关系。)

ViewModel层

小ViewModel层(里面那个)只负责前端事件的数据处理,并和Model层进行数据同步。DTO层是对前端使用数据的一套封装类,如后台中User的个人信息和User的购课数量在两个不同的entity类里,那么在ViewModel实现类(里面那个)就可以把二者封装到一个UserDTO类里。

View层

View层负责展示页面,页面跳转和监听用户操作事件,不管数据处理。其内部的controller不是MVC里的controller(但是javafx喜欢叫他controller所以我就沿用了),它负责一个fxml页面/组件的前端逻辑,controller和fxml的关系是一对一。其实硬要说的话,View红框里的controller层对应MVP里的presenter,fxml层对应MVP的view。controller层负责处理前端页面逻辑以及和VM之间的通信,fxml(真正的view层)就变成了薄薄的一层纯xml页面样式。从这个角度来看,这个项目的框架实际上是结合了MVP和MVVM的思想,形成了一个M-VM-P-V的结构。

静态代理

javafx提供的FXMLLoader类加载controller和fxml文件的代码有很多种不同的写法,由于历史原因,有些写法貌似不兼容项目使用的openfx最新版sdk(16),为了统一组内的写法,我写了一个封装了FXMLLoader一些基本应用的静态代理工具类。

FXML封装的方法

好吧,这么写qs有点多此一举,其实是我每次加载页面都要写好几行代码,看着难受,干脆封装起来一行搞定。(当然后续有精力搞什么AOP也是可以用的)

中介者模式

中介者集中管理一组需要相互调用的controller类。加载fxml的时候把controller注册进中介者,然后谁要用这个controller(从另一个页面/组件调用这一个页面/组件的前端业务)就直接去中介者里面拿,然后调用就好。

写不动了,以后慢慢写

单例工厂

项目中已实现的工厂是上述中介者的单例工厂。后续有需要还可以加VM的工厂。

目录结构

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Kotlin是一种静态类型的编程语言,具有JVM的可移植性和Java的互操作性。Spring Boot是一个用于创建独立的、基于Spring框架的Java应用程序的框架,它提供了快速开发应用程序所需的所有功能。JavaFX是一个用于创建丰富客户端应用程序的框架,它提供了丰富的UI组件和布局管理器。 要使用Kotlin Spring Boot和JavaFX开发桌面应用程序,需要完成以下步骤: 1. 创建一个Kotlin Spring Boot项目。可以使用Spring Initializr创建项目,选择Kotlin和Spring Web依赖项。 2. 添加JavaFX依赖项。可以在pom.xml文件中添加以下依赖项: ``` <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>16</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>16</version> </dependency> ``` 3. 创建一个JavaFX应用程序类。可以使用JavaFX的Application类作为应用程序的入口点。在这个类中,可以创建UI组件,处理事件和管理应用程序的状态。以下是一个简单的JavaFX应用程序类的示例: ```kotlin import javafx.application.Application import javafx.fxml.FXMLLoader import javafx.scene.Parent import javafx.scene.Scene import javafx.stage.Stage class MyApplication : Application() { override fun start(primaryStage: Stage?) { val root: Parent = FXMLLoader.load(javaClass.getResource("/fxml/main.fxml")) primaryStage?.title = "My Application" primaryStage?.scene = Scene(root) primaryStage?.show() } companion object { @JvmStatic fun main(args: Array<String>) { launch(MyApplication::class.java, *args) } } } ``` 4. 创建FXML布局文件。FXML是一种XML格式的文件,用于定义UI组件和布局。可以使用Scene Builder或手动创建FXML文件。以下是一个简单的FXML布局文件的示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:id="root" prefHeight="400" prefWidth="600"> <Button fx:id="button" text="Click me" layoutX="250" layoutY="180" /> </AnchorPane> ``` 5. 在JavaFX应用程序类中加载FXML布局文件。可以使用FXMLLoader类加载FXML布局文件,并将其添加到应用程序的场景图中。以下是一个示例: ```kotlin val root: Parent = FXMLLoader.load(javaClass.getResource("/fxml/main.fxml")) primaryStage?.title = "My Application" primaryStage?.scene = Scene(root) primaryStage?.show() ``` 6. 处理UI事件。可以在JavaFX应用程序类中添加事件处理程序,以响应UI组件的事件。以下是一个处理按钮单击事件的示例: ```kotlin button.setOnAction { event -> println("Button clicked!") } ``` 7. 使用Spring Boot管理应用程序的状态。可以使用Spring Boot的依赖注入和管理功能来管理应用程序的状态和依赖关系。可以在Spring Boot的配置类中定义bean,然后在JavaFX应用程序类中使用它们。以下是一个简单的Spring Boot配置类的示例: ```kotlin @Configuration class AppConfig { @Bean fun myService(): MyService { return MyService() } } ``` 8. 在JavaFX应用程序类中使用Spring Boot的依赖注入功能。可以在JavaFX应用程序类的构造函数中注入Spring Boot管理的bean。以下是一个示例: ```kotlin class MyApplication : Application() { @Autowired lateinit var myService: MyService // ... } ``` 这就是使用Kotlin Spring Boot和JavaFX开发桌面应用程序的基本步骤。当然,还有很多其他的细节和技术,可以根据需要进行学习和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值