java图形界面库fx_JavaFX的布局技巧

本文分享了关于JavaFX的编程经验,强调避免使用fxml和Spring,推荐使用Java代码直接编写界面。JavaFX的布局可以通过BorderPane,GridPane等容器进行管理,掌握setPadding和setSpacing方法至关重要。对于网络连接,Java标准库已经足够强大,可以考虑使用如Vert.x的库。此外,文章提到了打包工具和在Steam上发布时的注意事项,以及如何用JavaFX创建Flutter样式的图标。
摘要由CSDN通过智能技术生成

好久没写文章了,手痒,写点编程经验吧,最近好多人问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文件夹

大概这些

最后给一个彩蛋吧,用JavaFX做出Flutter上那些icon矢量图,代码如下:

public static SVGGlyph createSVGGlyph(String glyph){

return createSVGGlyph(glyph, 24, 24, Color.WHITE);

}

public static SVGGlyph createSVGGlyph(String glyph, int width, int height, Color color){

SVGGlyph svgGlyph = new SVGGlyph(0, "", glyph, color);

// svgGlyph.setFill(Color.WHITE); svgGlyph.setSize(width,height);

return svgGlyph;

}

静态方法,直接static import之后就能用了,然后string怎么找,先去下载svg文件,就是矢量图文件,然后把这个文件放到idea里面去,idea会解析这个svg文件,然后你找到最长的那个字符串,那个就是我们方法所使用的参数,放到SVGGlyph方法里面去(如下图),然后就会返回一个SVGGlyph对象给你,这个是graphic对象,你可以用一些node的set graphic设置该图标,我写了一个createSVGGlyph方法,直接返回Label对象,你放到GUI上去就好了,你可以用JavaFX组件的set graphic方法设置该图标,Flutter上那些icon基本上都能在网络上找到,注意依赖的SVGGlyph在jfoenix项目里面,要添加该依赖,黎巴嫩人搞这些图形上的东西就是牛逼,jfoenix是开源的一个JavaFX的material design的库,你可以用它来实现ripple effect之类的,提升逼格

bye

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值