TornadoFX编程指南,第1章,为什么选择TornadoFX?

译自Why TornadoFX?

介绍

用户界面对消费者和商业应用的成功越来越重要。 随着消费者移动应用程序和Web应用程序的兴起,企业用户越来越多地将企业应用程序保持在更高的质量水平。 他们需要丰富的功能,丰富的用户界面,提供直观的洞察力,直观地浏览复杂的屏幕。 更重要的是,他们希望应用程序能够频繁地适应业务变化。 对于开发人员来说,这意味着应用程序不仅要可以维护,而且可以演化。 TornadoFX旨在帮助所有这些目标,并大大简化JavaFX UI的编码。

虽然大部分企业IT世界正在推动HTML5和基于云的应用程序,但许多企业仍在使用像JavaFX这样的桌面UI框架。 虽然它不像Web应用程序那样轻易地分发给大众,但JavaFX适用于“内部”业务应用程序。 它的高性能与大型数据集(事实上它是本机Java)使其成为企业防火墙后面应用程序的实际选择。

像许多UI框架一样,JavaFX可能会很快变得冗长且难以维护。 幸运的是,Kotlin的发布创造了一个机会来重新思考如何构建JavaFX应用程序。

正在开发的一个有趣的产品是JPro,一个基于Web的JavaFX容器,不使用插件。 它可以与TornadoFX和JavaFX配合使用,但在本文写作时仍然处于封闭式测试阶段。 您可以follow该项目并等待其可用性: https://jpro.io/

为什么选择TornadoFX?

2016年2月,JetBrains发布了Kotlin,一种新的JVM语言,强调实用主义。 Kotlin在更高级别的抽象中工作,并提供Java中不可用的实用语言功能。 Kotlin的一个更重要的功能是与现有Java库和代码库(包括JavaFX)的100%互操作性。

虽然JavaFX可以与Java一样在Kotlin中使用,但还是有些人认为Kotlin具有的语言功能可以简化JavaFX的开发。 在Kotlin测试版之前,Eugen Kiss用KotlinFX将JavaFX “构建器(builders)” 原型化。 2016年1月,Edvin Syse重新启动了该计划并发布了TornadoFX。

TornadoFX旨在大大减少构建JavaFX应用程序所需的代码量。 它不仅包括快速布局控件和用户界面的类型安全构建器(type-safe builders),还包括依赖注入,委托属性,控件扩展功能(dependency injection, delegated properties, control extension functions)以及Kotlin使能的其他实用功能。 TornadoFX是Kotlin可以简化代码库的精美展示,它以优雅和简单的方式解决了UI代码的冗长性问题。 它可以与其他流行的JavaFX库(如ControlsFXJFXtras)协同工作。 它与反应式框架(如ReactFX)以及RxJava和友库(包括 RxJavaFX, RxKotlin, 和RxKotlinFX) 非常相似 。

读者要求

这本书希望读者能够了解Kotlin的知识,并花了一些时间了解它。 将有一些Kotlin语言功能的覆盖,但仅在一定程度上。 如果您还没有这样做,请阅读JetBrains Kotlin参考资料(JetBrains Kotlin Reference),并花上好几个小时研究它。

熟悉JavaFX肯定是有助的,但这不是一个要求。 也许你刚开始学习JavaFX,但发现其开发体验是乏味的,所以你正在审视TornadoFX,希望它提供了一种更好的方式来构建用户界面。 如果这描述了你的体验,而且你正在学习Kotlin,那么你可能会受益于本指南。

一个撩动你的例子

如果你以前使用过JavaFX,则可能会在某个时候创建​​一个TableView 。 假设你有一个给定领域类型的Person 。 TornadoFX允许您更简洁地创建类似JavaBeans风格的用于JavaFX的绑定。

class Person(id: Int, name: String, birthday: LocalDate) {
    val idProperty = SimpleIntegerProperty(id)
    var id by idProperty

    val nameProperty = SimpleStringProperty(name)
    var name by nameProperty

    val birthdayProperty = SimpleObjectProperty(birthday)
    var birthday by birthdayProperty

    val age: Int get() = Period.between(birthday, LocalDate.now()).years
}

然后,您可以构建一个包含TableView的整个“ View ”,其代码占用空间很小。

class MyView : View() {

    private val persons = listOf(
            Person(1, "Samantha Stuart", LocalDate.of(1981,12,4)),
            Person(2, "Tom Marks", LocalDate.of(2001,1,23)),
            Person(3, "Stuart Gills", LocalDate.of(1989,5,23)),
            Person(3, "Nicole Williams", LocalDate.of(1998,8,11))
    ).observable()

    override val root = tableview(persons) {
        column("ID", Person::idProperty)
        column("Name", Person::nameProperty)
        column("Birthday", Person::birthdayProperty)
        column("Age", Person::age)
    }
}

渲染输出:

该代码的一半只是初始化样本数据! 如果您关注声明TableView的四个列(如下所示)的部分,您将看到它需要一个简单的功能构造来构建TableView 。 它也会自动支持对字段的编辑。

tableview(persons) {
    column("ID", Person::idProperty)
    column("Name", Person::nameProperty)
    column("Birthday", Person::birthdayProperty)
    column("Age", Person::age)
}

如下所示,我们可以在TableColumn上使用cellFormat()扩展函数,并为“Age”值创建小于18的条件格式。

tableview<Person> {
    items = persons
    column("ID", Person::idProperty)
    column("Name", Person::nameProperty)
    column("Birthday", Person::birthdayProperty)
    column("Age", Person::age).cellFormat {
        text = it.toString()
        style {
            if (it < 18) {
                backgroundColor += c("#8b0000")
                textFill = Color.WHITE
            }
        }
    }
}

渲染输出:

这些声明是纯Kotlin代码,而TornadoFX包含了数十种类似这样的情况的表现力。 这允许您专注于创建解决方案,而不是苦于构建UI代码。 您的JavaFX应用程序不仅可以更快地转变,而且可以维护和演进。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,552评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,228评论 25 707
  • 译自《Editing Models and Validation》 编辑模型和验证 作为开发人员,TornadoF...
    公子小水阅读 1,814评论 0 3
  • 公司:宁波大发化纤有限公司 姓名:冯玉停 期数:六项精进224期感谢二组学员,234期感谢三组志工 [日精进打卡第...
    尘埃wyzh阅读 98评论 0 0
  • 故事的开头由两个年轻人的爱情萌芽引入,是东野一贯的风格,引子结束,来到正题。 东京一户人家的小孩惨遭杀害,母亲小夜...
    寂寞笙歌凉阅读 584评论 0 0