TornadoFx 页面之间的数据传递
和Android开发一样,经常遇到两个页面之间需要进行数据的交互传输,本文讲解下TornadoFx框架中,页面之间的数据传递步骤方法
方法1 - 使用构造方法
首先,我们知道TornadoFx中,页面可以是View或Fragment,然后View或Fragment对象中提供了对应的打开窗口的方法
比如说
openModalopenWindowopenInternalWindow
3种方法就是窗口模式有些不同,具体说明可以参考此文档3. Components
而我们需要传递数据,最简单的一种方法就是通过构造方法去传,如下面例子
class TestParamView : View("My View") {
override val root = vbox {
setPrefSize(300.0,300.0)
button("跳转页面") {
action {
TestParamAView(1).openModal()
}
}
}
}
class TestParamAView(val type:Int) : View() {
override val root = vbox {
setPrefSize(300.0,300.0)
text(type.toString())
}
}
效果如下所示:

那么,如果需要页面结束回传数据呢?
这里,TornadoFx默认没有相关方法,我们只能自己改造着实现了
既然我们可以传参,那么,我们也可以将函数回调传入,之后新页面关闭之前回调一下我们的方法即可实现上述要求
假设我们需要新页面返回String类型的数据,具体代码如下:
class TestParamView : View("My View") {
override val root = vbox {
setPrefSize(300.0, 300.0)
button("跳转页面") {
action {
val closeAction = { s: String ->
println("这是返回的数据: $s")
}
TestParamAView(1, closeAction).openModal()
}
}
}
}
class TestParamAView(val type: Int, closeAction: (String) -> Unit) : View() {
override val root = vbox {
setPrefSize(300.0, 300.0)
text(type.toString())
button("返回数据") {
action {
closeAction.invoke("数据11")
close()
}
}
}
}
效果如下,可以看见控制台也是已经输出了返回的数据

上面流程,我们需要手动在调用close方法前才回调closeAction,如果想要点击页面右上角关闭而返回的话,应该怎么做?
View和Fragment有对应的生命周期,在onUndock()方法来实现拦截即可
class TestParamView : View("My View") {
override val root = vbox {
setPrefSize(300.0, 300.0)
button("跳转页面") {
action {
val closeAction = { s: String ->
println("这是返回的数据: $s")
}
TestParamAView(1, closeAction).openModal()
}
}
}
}
class TestParamAView(val type: Int, closeAction: (String) -> Unit) : View() {
override val root = vbox {
setPrefSize(300.0, 300.0)
text(type.toString())
button("返回数据") {
action {
close()
}
}
}
override fun onUndock() {
super.onUndock()
closeAction.invoke("数据11")
}
}
之后不管是通过代码触发close方法还是点击页面右上角,最终都会走到onUndock方法里去
然后剩下的就是逻辑完善了,比如在什么时机传回数据,传回其他类型的数据,各位参考上面思路即可
方法2 - 使用param()方法
如果说你的使用情景中,打开的View或Fragment都是固定的一个对象,可以使用TornadoFx框架提供的find方法来打开页面
find方法里同时提供了传参使用,如下面例子:
class TestParamView : View("My View") {
override val root = vbox {
setPrefSize(300.0, 300.0)
button("跳转页面") {
action {
val closeAction = { s: String ->
println("这是返回的数据: $s")
}
find<TestParamAView>(
mapOf(
TestParamAView::type to 1,
TestParamAView::closeAction to closeAction
)
).openModal()
}
}
}
}
class TestParamAView() : View() {
val type: Int by param()
val closeAction: (String) -> Unit by param()
override val root = vbox {
setPrefSize(300.0, 300.0)
text(type.toString())
button("返回数据") {
action {
close()
}
}
}
override fun onUndock() {
super.onUndock()
closeAction.invoke("数据11")
}
}
传承需要传递有个map集合,TestParamAView::type是反射的用法,实际上就是得到结果就是一个字符串type,直接定义为"type"也是可行的,因为要相同的key才能注入参数,用反射的用法可以避免写错导致的不匹配问题
而在需要接受参数页面内,通过param的委托方法来获取数据
如果说你的情景可能参数会传空,可以定义类型为空类型
val type: Int? by param()
之后的返回参数和上面章节一样,不再赘述
TornadoFx 页面之间的数据传递的更多相关文章
- [Swift实际操作]八、实用进阶-(8)使用performSegue在故事板页面之间进行数据传递
本文将演示故事板页面之间的数据传递.首先在一个空白项目中,打开项目自带的故事板文件(Main.storyboard).故事板中已经拥有了一个视图控制器,点击选择该视图控制器.然后依此点击[Editor ...
- HTML5中window.postMessage,在两个页面之间的数据传递
HTML5中window.postMessage,在两个页面之间的数据传递 2015年11月3日 8536次浏览 关于postMessage window.postMessage虽然说是html5的功 ...
- 微信小程序学习笔记(1)- 按钮触发的函数的定义以及不同页面之间的数据传递
<view class='item' bindtap='onCountryTab' data-idx='4'> 1)bindtap属性用来设置控件需要绑定的函数,函数用单引号括起来:. 2 ...
- ASP.NET MVC3中Controller与View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一. Controller向Vie ...
- (转载)Javascript操作表单之间的数据传递
(转载)http://www.aspxhome.com/javascript/skills/200710/214825.htm 今天有朋友问我关于用JAVASCRIPT来进行页面各表单之间的数据传递的 ...
- React中父组件与子组件之间的数据传递和标准化的思考
React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...
- 解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function
Vue的项目中,如果项目简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 进行传递 但是如果是大中型项目中,很多时候都需要在不相关的平行组件之间传递数据,并且很多数据需要 ...
- JSP、servlet、SQL三者之间的数据传递
JSP.servlet.SQL三者之间的数据传递 博客分类: web开发 JSPservletSQL数据库连接池web开发 前言: 最近一直在做WEB开发,现总结一下这一段时间的体会和感触. 切记, ...
- Activity之间的数据传递
最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...
- ASP.NET MVC 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
随机推荐
- IBM Cloud Computing Practitioners 2019 (IBM云计算从业者2019)Exam答案
Cloud Computing Practitioners 2019 IBM Cloud Computing Practitioners 2019 (IBM云计算从业者2019)Exam答案,加粗的为 ...
- pandas之聚合函数
在<Python Pandas窗口函数>一节,我们重点介绍了窗口函数.我们知道,窗口函数可以与聚合函数一起使用,聚合函数指的是对一组数据求总和.最大值.最小值以及平均值的操作,本节重点讲解 ...
- C语言中,取反运算符~a=-(a+1)的原因
1.因为计算机直接拿读取到的数据去运算付出的代价是最小的,所以计算机存储的数据的形式应该满足读取后不必经过任何加工就能直接用来运算由于原码不经加工无法实现(+a)+(-a)=0,所以不满足该要求,为了 ...
- ROS机器人校正
vROS机器人IMU自动校正 连接小车 注意:必须在同一区域网 ssh clbrobort@clbrobort 激活树莓派主板 roslaunch clbrobot bringup.launch 自动 ...
- Spring Security 报:Encoded password does not look like BCrypt
SpringBoot 集成 Security 时,报 Encoded password does not look like BCrypt 原因:SecurityConfig 必须 Bean 的形式实 ...
- vue全家桶进阶之路12:监听器 watch
在Vue2中,监听器(watch)用于监测数据的变化,并在数据变化时执行一些操作.监听器可以用来响应用户输入.观察数据变化.执行异步操作等. 监听器的使用方法如下: 在组件的watch选项中定义一个或 ...
- Sql Server维护计划事务日志找不到目标数据库
1.发现事务日志备份突然停止了 2.查看维护计划中的事务日志设置 3.发现备份任务中,事务日志需要指向的数据库不在 4.进入数据库属性 5.在选项中将恢复模式改为"完整"
- import MySQLdb as Database ModuleNotFoundError: No module named ‘MySQLdb‘
import MySQLdb as Database ModuleNotFoundError: No module named 'MySQLdb' import MySQLdb as Database ...
- es 笔记二之基础查询
本文首发于公众号:Hunter后端 原文链接:es笔记二之基础查询 这一篇笔记介绍 es 的基础查询. 基础查询包括很多,比如排序,类似数据库 limit 的操作,like 操作,与或非等,对于这些操 ...
- 人工智能导论——口罩佩戴检测详解(附带MTCNN论文精读)
人工智能导论--口罩佩戴检测详解(附带MTCNN论文精读) 一.问题重述 随着人类的科技不断进步,病毒也在随之更新迭代:在19年席卷全球的新冠肺炎疫情给人们的生活带来了极大的灾难,造成了无数的人因此失 ...