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 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
随机推荐
- python入门教程之九日期时间常用操作
Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示. Py ...
- Java代理之jdk动态代理+应用场景实战
本文将先介绍jdk动态代理的基本用法,并对其原理和注意事项予以说明.之后将以两个最常见的应用场景为例,进行代码实操.这两个应用场景分别是拦截器和声明性接口,它们在许多开发框架中广泛使用.比如在spri ...
- 异常:java.io.FileNotFoundException:e:\demo(拒绝访间。)
禁止向目录中写数据,只能向文件写数据
- Redis(一)五种基本数据类型
1 NoSQl数据库 1.1 技术的发展 技术的分类: ①解决功能性问题:javase ②解决扩展性问题:框架 ③解决性能问题:redis 1.2 NoSQL数据库概述 NoSQL(Not Only ...
- CSS3-页面布局基础二——Box Model、边距折叠、内联与块标签
一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...
- 使用 Transformers 进行图分类
在之前的 博文 中,我们探讨了图机器学习的一些理论知识.这一篇我们将探索如何使用 Transformers 库进行图分类.(你也可以从 此处 下载演示 notebook,跟着一起做!) 目前,Tran ...
- 微信小程序隐藏页面滚动条
开发小程序时,经常会碰到页面长度超过屏幕高度,然后下拉时会出现滚动条,对于一些有强迫症的人来说是不可忍受的. 网上看了好多,写的.都评论有起作用或者不起作用的. 我在这分享一个全局隐藏滚动条的方式. ...
- 飞腾CPU FT-2000/4 uboot下PHY调试记录
飞腾爱好者技术交流群码公众号"乌拉大喵喵" 一.环境说明 板子是FT-2000/4的开发板: 固件版本: ft-2004c_u-boot-v2-Ver0.3_20211223100 ...
- UniApp小程序开发如何获取用户手机号
我们在小程序开发的时候经常遇到这种需求,需要在账号登陆的时候进行手机号获取,并使用手机号登陆. 本文讲述如何在前后端分离的状态下获取手机号 查阅官网文档不难发现我们需要使用uni.login()这个方 ...
- 深度学习03-(图像梯度处理、图像轮廓、图像预处理在AI中的应用)
深度学习03-计算机视觉基本理论2 深度学习03-(计算机视觉基本理论2) 图像梯度处理 什么是图像梯度 模板运算 均值滤波 高斯滤波 中值滤波 边沿检测 锐化 图像轮廓 什么是图像轮廓 查找和绘制轮 ...