只接受发布货源信息,不可发布违法信息,一旦发现永久封号,欢迎向我们举报!
1064879863
16货源网 > 餐饮行业新闻资讯 > 软件开发 >  学过JAVA ,想学GUI。网友说swing awt被淘汰了。请教现在主流的JAVA gui开发学啥?


学过JAVA ,想学GUI。网友说swing awt被淘汰了。请教现在主流的JAVA gui开发学啥?

发布时间:2019-09-03 03:27:18  来源:网友自行发布(如侵权请联系本站立刻删除)  浏览:   【】【】【
javafx还有一件事,主流java基本不写gui了
学过JAVA ,想学GUI。网友说swing awt被淘汰了。请教现在主流的JAVA gui开发学啥?

javafx

还有一件事,主流java基本不写gui了

Java就没主流做GUI的,你的方向完全错了。

唯一还能算的android,不过那仅仅是披着Java外衣的另一个生态罢了。

想做GUI应用现在大多两个方向,跨平台QT,Windows WPF(.net C#)。

Java的GUI,你能找到的,有两个比较大的项目,一个叫Eclipse,一个叫IDEA,你去用一下,就明白为啥大家都不赞成你去学Java GUI了,GUI技术那么多,干嘛选这个一点都不突出的

现在没啥主流的Java GUI了。如果实在想折腾就试试JavaFX或Eclipse RCP吧。小众一点的可以试试Apache pivot或Netbeans Platform。

Java的GUI我倒是用过不少。

Swing的话是Java最传统的GUI了,初始界面不怎么样,但是有很多LookAndFeel,如果想偷懒可以直接使用其他人封装的LookAndFeel改变界面,效果也是不错的,Swing经过了这么久的发展,已经十分成熟,多数的坑都能够找到解决办法,淘汰到算不上,不过好像已经不更新了,因为Java在主推另一个GUI技术,JavaFX。

JavaFX是Java目前官方推荐的GUI技术,XML进行布局,支持CSS,你学过HTML之类的WEB开发的话,应该知道CSS是个啥,他的界面极其灵活,通过FXML和CSS也能够很快速的构建界面,但是系统的资源消耗会比较大,不过这应该不是什么问题吧。它还直接支持音频视频和动画效果,好像还有3D功能,不过现在应该还不稳定,JavaFX应该还是可以移植到Android的,ios不是很清楚。但是这个东西在windows之外的平台上面会有坑点,要特别注意。

SWT、JFace,这个是Eclipse用的技术,就是那个Java的开发工具Eclipse,还可以吧,但是需要一些平台相关的东西,用起来稍微有点别扭,UI里面有些细节不能自己控制,但是界面的效率会高一些,毕竟是直接的JNI,很多是直接使用系统本身的控件,好像是支持CSS的,反正我没用出来过。

QtJambi,Qt的Java版,Qt本身是c++的类库,这个是给java提供的语言绑定,不过qt的话只到了Qt4,也不知道有没有人继续更新维护。这个版本提供的设计器好像有点问题,不过可以自己编写代码进行设计,反正设计器的ui文件最终也会变成java代码,如果你用过Qt的话可以试试。

Gnome-Java,Linux系统可以试试,因为他不支持windows,我没有用过他,只是知道而已。

哦,对了,AWT,不知道你为啥会提到这个,现在你就当他不存在好了,基本是不会直接使用AWT的。

Java就没有GUI!

实在不行,试试Eclipse RCP?

稍微讲一下java gui的历史吧,java的gui的延伸其实还包括了安卓以及谷歌做的那些努力

java最早的图形控件就是awt,这个没问题,但是awt做的事很少,基本上只是做一点简单的包装,所以如果你用的是awt的话,你可能会有比较多的工作要做,比如你想做动画,用awt就会遇到屏幕闪烁的问题,所以你要去弄离屏表面,然后渲染完之后再flip过去,这个属于极为低端的技术,awt这种低层次的封装你就必需要用这种手段,开发很慢,其实你用c之类的,估计还能遇到这种问题

这是第一个阶段


那后来就出现了一个发展,sun当时发展出了swing,但是这时候爆发了一个巨大的导致分裂的冲突,那就是ibm当时提出了使用swt,而sun提出了swing,swt代表着native widget的分支和走向,而swing则代表了emulate widget的分支和走向

这两者的区别呢,我这里简单说一下,native widget的做法主张,更多地复用操作系统本身的控件和样式,举个例子,比如windows提供了图形库directx3d,macosx提供了图形库是metal,标准则是opengl和vulkan,那么swt一派就认为,我们应该提供一个统一的api,然后这个api在实现的时候,根据操作系统的差异,自动选择不同的图形库予以使用,这样这个api就是一层thin wrapper,这样做的好处就是,你可以很快滴利用上操作系统提供的各种图形库,比如win上就用directx,mac上就用metal,etc.还有窗口的样式等,但是坏处就是,你在不同的操作系统上,看到的样式什么的,会有差异,比如swt在它网站上给出的几个例子就很好滴说明这一点,不同操作系统上的展示有明显的不同,如下图:

同样的窗口在不同操作系统上的展示,很明显可以看出很多差异来

那swing则表示,这个太不跨平台了,java应该编译一次,然后到处运行,而且到处运行时候看起来应该是一样的,彻底屏蔽操作系统带来的差异,应该做一层thick wrapper,厚包装,那这样做的坏处有几个,第一个就是不同操作系统的图形库不一样,那强行一致的结果就是,只能用最弱鸡的那个去搞了,当时标准是opengl,那就是opengl了,在win上也用不了directx,而且不是所有的操作系统都有这么高级的渲染工具的,所以swing还缺省提供了一个没有硬件加速,纯软件渲染的界面,而且更要命的是,缺省是不开硬件加速的,所以这就导致swing做出来的时候,慢,因为没开硬件加速,哪怕你的显卡支持你能用硬件加速渲染,它还是缺省会用纯软件渲染,然后你要懂怎么开硬件加速才能实现你想要的效果,就像很多人可能至今都不知道idea的vmoption其实是可以开硬件加速的吧?在help里面,选择vmoption,然后添加上这一行:-Dsun.java2d.opengl=true,以启动硬件加速

参考:https://stackoverflow.com/questions/4627320/java-hardware-acceleration

而且还很要命的一点,swing的组长似乎对于gui好看不好看没有什么概念,缺省用的是unix那一套gui,就是几十年前的那种gui,这里贴出苹果早期的gui,macos也是freebsd的变种,都是unix的一员,所以早期版本的gui还保留了比较多unix原始的形态,看看就能感觉出来跟swing那个是不是很像了,看拖动条的紫色,几乎一摸一样

unix gui

早期机能所限,能做成这样已经很好了,但是进入90年代之后,还在画这种窗口,那就只能给人感觉原始了

这是第二个阶段,这个阶段的过程就是swing和swt两边吵翻天,内讧,最后java在gui上大败,铩羽而归,因为swing缺省的界面丑,慢,加上java早期本身也不怎么快,所以java在gui上几乎是没有咬下任何市场,早期在智能机上的j2me也被教主复出之后的iphone搞死了,swt最大的遗产就是eclipse了,swing最大的遗产就是idea还有netbeans了


然后进入第三个阶段,java后来发现,swing这个搞法不是个办法,没人用,sun在临死之前,总算头脑清醒了一回,走回swt的道路,搞出了javafx,然后sun就挂了,一开始是找ibm收购,ibm嫌贵,不买,然后sun才去找oracle收购,javafx也跟swt一样,根据os会自动选择不同的图形库,比如win上用的就是directx3d,mac上用的就是metal(将来,参考project lanai)

那这里还有一个分支,那就是教主复出之后,把iphone搞起来了,一搞起来就把可以装在j2me的智能机给搞死了,然后有一家公司叫做Google,Google其实在sun作为java当家的时候,Google大量参与了java标准的制定,一个是Google一个是Apache,这俩货几乎常年都在jcp执行委员会里呆着,所以java早期的大量标准的制定,都跟这俩货有很大关系。那Google看到苹果做出了iphone之后,就有样学样,弄出了安卓,当然一开始是鲁宾做的,然后Google收购来的,但是Google在安卓上使用的是一个魔改的java,所以保留了很多java原始的特性,当然Google拿到java之后,它就没照搬swing,但是呢,它保留了很多swing的影子,然后在Google被oracle告了之后,另劈新道,搞出了dart,flutter这些东西,而Google的skia引擎目前主要还是依赖opengl渲染,将来会加入vulkan渲染,因为这两是标准,这就跟swing很像了

你看,这个阶段swt变成了javafx,swing承认失败,java2d组开始更多地投入javafx,而javafx的设计沿袭了swt的设计,就是对操作系统底层的api做一层thin wrapper,但是安卓这边,则更多地延续了swing的设计,到了flutter阶段,实际上Google也还是自己做一层thick wrapper,flutter能保证不同操作系统上看到的界面是一样的,如果你用的是material design的话,那在ios上也有涟漪效果,如果你用的是cuptertino的话,那你在安卓机器上也能看到金属高光,但是这样做成本就高,但是Google有钱也有人,而且一直有传言说,Google招了太多人进去,无事可做,所以安排点工作给他们去做,哪怕这些工作只是重复造轮子,但是总比让他们闲着好,所以就让他们去造更快更好的轮子吧。flutter的设计就有一点这种味道在里面,什么都自己做,而且Google还做得相当不错

但是java没那么多人,所以javafx就选择了更加鸡贼一点的道路,做一层thin wrapper,看上去不一样就不一样,跨平台能用就行,javafx的组其实没有那么多人,常见就那么几个,johan,kevin,还有巴西人博格斯,其实没几个,flutter team的规模远比javafx的开发规模要大得多

那这个阶段就是我们目前正在经历的阶段,如果你问java gui用啥,那就是javafx,这个是java所有项目的共识,javafx也比较容易扩展,13之后,你都可以用native的手段来渲染,可以借助nativefx或者是driftfx项目,然后用上比如qt之类的控件。这里说一下,javafx的社区可以看到很多说德语的人,来自德国,奥地利,瑞士等,很多相关项目都是德国人在做,德国人在这种工程领域上造诣可见一斑。如果你不纠结于java自身,那你也可以看看flutter这些,dart/flutter其实就是Google版的java/javafx,因为dart以及dartvm的作者之一lars bak本身就是缺省jvm hotspot的作者,它的很多设计,原理什么,都跟java社区的差不多,不能说完全一样,但是你都能看到很多共同点,比如pub就是maven,skia就是prism,dart就是java,如果你会java的话,搞dart很快,分分钟上手


总结一下,第一阶段awt,第二阶段swing和swt,第三阶段javafx和flutter

如果你要学,学最后两个

责任编辑:
热门阅读排行
© 16货源网 1064879863