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 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
随机推荐
- 五月十四号java基础知识点
class Person{ private String name; private int age; public Person(String name,int age){ this.name = ...
- Python常见面试题016. 请实现如下功能|谈谈你对闭包的理解
016. 请实现如下功能|谈谈你对闭包的理解 摘自<流畅的python> 第七章 函数装饰器和闭包 实现一个函数(可以不是函数)avg,计算不断增加的系列值的平均值,效果如下 def av ...
- 用Abp实现找回密码和密码强制过期策略
@ 目录 重置密码 找回密码 发送验证码 校验验证码 发送重置密码链接 创建接口 密码强制过期策略 改写接口 Vue网页端开发 重置密码页面 忘记密码控件 密码过期提示 项目地址 用户找回密码,确切地 ...
- StringBuilder类用法解析
一.StringBuilder说明 StringBuilder是一个可变的字符序列.这个类提供了一个与StringBuffer兼容的API,但不保证同步,即StringBuilder不是线程安全的,而 ...
- 如何将c#在线编辑器嵌入自己项目
如何将c#在线编辑器嵌入自己项目 首先我们需要介绍一下这个在线编辑器,当前的在线编辑器支持c#的代码编译运行,并且无需后台服务,基于WebAssembly实现的在浏览器端去执行我们的c#代码,基于Ro ...
- KaiOS 2.5.X 使用 WebIDE 安装以及调试第三方应用程序
本教程将展示使用 Waterfox Classic 安装为 KaiOS 2.5.x 设计的应用,同时我们也非常推荐使用它来进行安装和调试应用. 本教程本身不会对手机产生任何损害,但请注意,你必须信任你 ...
- #Powerbi 利用动态格式字符串功能,实现百分数智能缩位(powerbi4月重磅更新功能)
以下内容(基于POWERBI 23年4月更新的最新版本) 实际业务中,日常报表一般都有一个较为规范的百分数缩位要求,如果统一要求保留一位小数,那么在有些时候,我们会面临被缩成0.0%的尴尬,例如原有的 ...
- #Python assign赋值,新增列操作
- jenkins的安装和配置(flask结合jenkins半自动化部署流程)
jenkins在虚拟机中安装 1.1 背景介绍 Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建.测试和部署等功能. Je ...
- Golang常用语法糖
1.名字由来 语法糖(Syntactic sugar)的概念是由英国计算机科学家彼得·兰丁提出的,用于表示编程语言中的某种类型的语法,这些语法不会影响功能,但使用起来却很方便.语法糖,也称糖语法,这些 ...