|
楼主 |
发表于 2021-1-4 00:27:31
|
显示全部楼层
给你看篇文章,算是解答了你之前的问题吧~ 原文:https://zhuanlan.zhihu.com/p/58292611
JavaFX的布局技巧
圆胖肿
好久没写文章了,手痒,写点编程经验吧,最近好多人问JavaFX的问题,是大学开学了吗?老师开始布置作业了吧?那就说点技巧吧,可以快速解决问题
JavaFX现在除了TornadoFX也就是Kotlin版的JavaFX以外,其他的好像还不能做到热加载,跟Flutter不一样,Flutter只要保存马上手机上就能热加载看到效果了,JavaFX需要你重启,虽然说启动也不慢,但是很多呆瓜会往里面塞Spring之类的玩意,Spring随便一个component都大得要命,而且启动贼慢,要扫描源文件要干嘛的,很影响开发体验,那肿么办呢?以下是几个技巧
1)别碰fxml,xml是我见过最辣鸡的设计,惨绝人寰,我用xml不管是什么版本的xml,没有一个给我好的体验,一个是parse起来很慢,另外一个你写起来没问题,但是很容易错,IDE能帮忙的很少,所以后来大部分设计出来的GUI,比如swift,dart的flutter这些,都放弃了*ml的搞法,swift选择了json作为配置文件,佛拉特是直接代码裸写,嗯,不管怎样,都比*ml简单不少,所以不破不立,不要跳入fxml的陷阱中去,你可以像佛拉特一样用代码裸写,整个程序效率会好很多
2)不要碰spring,尤其是别犯文明用语把spring boot什么塞进去,那样你的代码会瞬间变很大,而且启动会变得很慢,返璞归真,你就用你的Java就好了,依赖尽量少加,尽量做到零依赖,这对于你的程序分派很有帮助,Java以前尤其是J2EE相关的依赖,很多都是暴力解决问题,就是不考虑资源的使用情况,用最笨的方式解决问题,这不是说这种方式是错的,但是这种方式在某些场合,比如客户端,会大幅下降客户体验,如果你在乎你的程序用户,就不要乱加依赖
3)Kotlin等语言包装的FX api,选择性使用,目前已经有Kotlin, Groovy还有Scala的JavaFX包装,我估计Clojure也有,懒得查了,Graal那边还有JS等脚本的包装,那添加这些语言的包装,必然会引入这些语言的依赖,这个应该还好,因为有些语言的依赖比较小,跟spring那种庞然大物不是一个规模的,但是相比较而言,这些语言的技巧要高深一点,比如很多人用的TornadoFX,如果你对Kotlin不熟悉,尤其是对Java都搞不太明白的话,那劝你还是算了吧
总之一句话就是,返璞归真,不要乱加东西,Java本身就是general purpose的语言,标准库足够你实现绝大多数需求了,真要你加的东西应该不太多
那多数人遇到的第一个门槛应该是布局,JavaFX的布局比Flutter要简单很多,因为JavaFX的组件node并没有像Flutter一样分为stateful和stateless widget,node就是node,但是因为没有热加载,所以不够直观,而且api不是那么直观,那布局的方式之前说过一个最笨的无脑用pane的绝对+相对布局,那其实JavaFX跟Flutter一样,也提供了很多container,比如BorderPane,GridPane,FlowPane,VBox,HBox……等等,基本上都挺好用,那这些所有的容器,都有两个关键方法,一个是四边的间距,叫做set padding方法,参数是new inset(上下左右的距离)还有一个是容器内部组件的距离,叫做set spacing方法,记住这两个常用方法,基本上容器的布局搞定了,剩下的看容器叫什么名字,猜都能猜出来他们的布局方式
所以不碰fxml的话,这里会很简单,因为都是Java代码,当然需要有一定的空间想象能力,那我相信这个只要是参加过高考的,这点能力应该不是问题
剩下的网络连接的话,这个是Java的强项,其实Java标准库里面的网络相关api已经很容易了,Netty和Vert.x之类的依赖可以考虑添加,尤其是Vert.x还提供了十几种clients,包括常用的web client,http client,net client,datagram socket,mail client,mqtt client……我记得我曾经在群里总结过,大概有十二三种至少,还在不断添加中,那vert.x的依赖core大小是20m左右,所以能否接受,你自己看着办,vert.x的client是基于eventloop的,对吧,那如果直接在它的callback handler里面渲染GUI控件的话,可能会跳出异常,告知你不允许在非ui线程中修改GUI控件,那肿么办呢?很简单,用platform.run later方法将渲染的代码转交ui线程执行
然后是打包技巧,这个其实并不是Java的问题,而是操作系统相关的问题,我在JavaFX群(518914410)里上传了windows和macos平台下打包的工具,可以直接做出双击执行的程序以及软件安装包,提升逼格,你还可以换掉图标,安装图标等等,看上去给人很高大上的感觉,直接去群文件下载就好了,想起vert.x群里某人说的笑话,竞标的时候,对方给出了客户端的标书,而他只有web,结果一下子就被pk掉了,后来竞争对手的客户端做失败了,才把单再转给他,导致他春节前去帝都出差,差点回不了家过年,笑死,这故事告诉我们,客户端对于客户体验是很重要的,web能解决问题,但是体验很难保证
最后一个是Steam上发布的小坑,macosx下用jlink制作的runtime,legal里面的文件,在windows下会出错,因为Steam上发布的游戏呢,是同时需要放入win runtime以及mac runtime的,如果有linux版的话,也需要放入linux runtime,以后如果有fuchsia版的话,这里还需要放入fuchsia runtime,所以window用户如果从Steam上下载你的游戏,mac runtime里面的legal文件夹会导致下载失败,好像是链接在win下不安全还是怎么肥四,一种比较极端的方式是吧legal文件夹给删了,当然这个在法理上不合理,虽然openjdk估计也不会来告你,但是比较正派的做法,还是保留,但是别用链接,可以把链接里面的文件拷贝出来,放到legal文件夹下就好了,具体操作可以参考win runtime下的legal文件夹
大概这些 |
|