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 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
随机推荐
- 【Vue原理模拟】模拟Vue实现响应式数据
1. 预期效果 当数据变动时,触发自定义的回调函数. 2. 思路 对对象 object 的 setter 进行设置,使 setter 在赋值之后执行回调函数 callback(). 3.细节 3.1 ...
- Spring注解系列——@PropertySource
在Spring框架中@PropertySource注解是非常常用的一个注解,其主要作用是将外部化配置解析成key-value键值对"存入"Spring容器的Environment环 ...
- 多态、抽象、Object类
1.方法重写要求:方法名相同.参数类型相同.返回值相同或其子类返回值相同,子类修饰符要不小于父类 2.方法重载要求:方法名相同.参数类型不同.返回值没有改变.修饰符无关 3.多态的前提是继承.多态是定 ...
- LeeCode数组问题:二分查找
LeeCode 704 二分查找 题目描述: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标, ...
- spring-boot-starter-parent not found
项目开始的springboot版本为2.6.6 <parent> <groupId>org.springframework.boot</groupId> <a ...
- 在Vue中使用键盘事件,回调函数被执行两次
暂时先不考虑v-for的key,查看下面的代码 <template> <div> <form @submit.prevent="addTask"> ...
- Docker MariaDB配置主从复制
编写主节点配置文件master.cnf: [client] # 默认字符集 default-character-set=utf8mb4 [mysqld] # 字符集 character-set-ser ...
- 深度学习--PyTorch定义Tensor以及索引和切片
深度学习--PyTorch定义Tensor 一.创建Tensor 1.1未初始化的方法 这些方法只是开辟了空间,所附的初始值(非常大,非常小,0),后面还需要我们进行数据的存入. torch.em ...
- Python用哈希算法查找相似图片(包括不同分辨率,不同大小,不同格式的图片)
# -*- coding: utf-8 -*- ''' Python用哈希算法查找相似图片并放入[_df]的文件夹中 相似图片包括不同分辨率,不同大小,不同格式,只要图片相似就会算重复文件 安装cv2 ...
- 2021-02-22:一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置,那么整个棋盘就是横坐标上9条线、纵坐标上10条线的区域。给你三个 参数 x,y,k。返回“马”从(0,0)位置出发,必须走k步。最后落在(x,y)上的方法数有多少种?
2021-02-22:一个象棋的棋盘,然后把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置,那么整个棋盘就是横坐标上9条线.纵坐标上10条线的区域.给你三个 参数 x,y,k.返回"马 ...