使用Java做界面

heartlc 2013-08-07 09:39:08
各位大神,我想做一个界面,使用Java语言。
但是,使用Java自带的控件,感觉,挺难看的。
我想问一下,可以自己做控件吗?比如自己用PS做背景,做按钮,然后利用语言实现事件和后台逻辑。如果可以的话,麻烦各位大神说一下要用什么工具,或者去哪里找资料。
...全文
10685 37 打赏 收藏 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
fearlessMore 2013-08-20
  • 打赏
  • 举报
回复
我用Swing做出的例子:

JavaFX做出的界面:
后来又做出了自己编写的一套基于Synth的L&F,其与直接在代码中重绘某个组件不同,最大优点是具有可插拔性,即在不改变原有程序代码的情况下,用户可以自己选择切换风格,通用性增强。对于前面的JLayer的界面切换成MyLNF后的效果:
获得焦点效果:
失去焦点后的效果:
鼠标移到Container内容面板上后显示的效果:
最后说下自己的感想:
1、现在Java界面编程真的不是首选。可插拔式的Look and feel不论基于Basic还是Metal编写繁琐,开发周期长。后来1.7推出的Synth基于XML导入式概念虽然新颖,但是对于Components Specific Properties的支持不够例如对于JTable的Properties支持很少导致可定制性降低。基于Nimbus编写的话,首先运行效率不如Metal,然后重绘每个Component也很麻烦,用图片做背景需要九宫格技术的支持。无论如何,Look and feel由于Java内部本身的限制,提供定制的范围确实有限,有些东西你customize不了,因为它没有提供那样的接口。
2、但是简单的界面编写如对动态效果没什么要求,对Desktop集成没什么要求(Java需要调用JNI来集成一些桌面特性,如WIn7任务栏图片的进度加载显示,还有比如SystemTray也只能用AWT的PopupMenu导致没法定制出和QQ、迅雷等一样的托盘效果),使用Swing还是可以的,Swing的优势也就在于跨平台性好,优于SWT。建议简单界面能使用Swing的还是不要使用SWT,对于简单界面,自己编写的L&F也搓搓有余了。
3、对于想要Charts多媒体支持、动画效果、滤镜支持、触摸事件感应处理等富Internet绚丽界面的追求的话,建议选择用JavaFX,可插拔式用外部链接的CSS代替,一般界面的编写可以用FXML,逻辑处理用Java语言或者JavaScript。这样结构化很明显,也很现代化(参见MVC设计模式)。但是JavaFX目前Bug还是很多,很多功能不完善,比如SystemTray没有支持,Print打印功能也是在未来Java8中绑定,但是对于打印表格table似乎还没有支持(我不大确定,因为我只是初步的看了一下,还没有深入研究)。但其UI组件未来会逐渐增多。
4、目前的话Java界面编写还是JavaFX比较有前途,但是就目前的JavaFX而言似乎没有什么明显的竞争力,只能期待以后的发展了。
5、建议还是用目前主流的软件编写工具(例如论坛同志所说的“要做Desktop GUI 推荐QT C++,ui tool 和 qml 非常易用强大。”)。想要在Windows下使用的话,还是尽量调用本地化的windows API。
6、用数据库相结合的小软件编写,Java还是不错的。内置的JavaDB就不错,MySQL以及Microsoft Database也有很多开发案例,使用Oracle大型数据库就更不用说了。

Swing给我印象最深的就是绘图机制十分强大,至少在引入Android的NinePatch技术上领先JavaFX(如果有同志知道如何在JavaFX上使用类似于Android的NinePatch技术的,非常感谢告知我),一定要深刻理解java界面的绘图机制。像背景图片什么绘制是很简单的,至于图像的缩放,运用ImageOP写个缩放的,或者模糊效果等等,在Java 界面代码中用paintComponent()方法来定制背景图片的可以根据addComponentListener()中的componentResize()来缩放就可以了(使用repaint())。绘制Border或者Button的背景,图片最好使用九宫格技术,防止图片拉伸失真。在Synth中,它自带把图片分为9块的技术,使用起来十分方便,然而不如Android的NinePatch技术,因为她不仅可以分图片为9块,而且可以根据需要分为若干块我非常欣赏。最近正在写一套的基于Nimbus的lnf(当然使用了Android的NinePatch技术),感觉还不错,推荐诸位试一下,我顺带研究JavaFX,觉得前途还是有的,因为Oracle计划不断随着Java8,9,10的推出更新、支持JavaFX。
heartlc 2013-08-13
  • 打赏
  • 举报
回复
引用 31 楼 raistlic 的回复:
[quote=引用 29 楼 heartlc 的回复:] [quote=引用 28 楼 fortheother 的回复:] 你要说说你要做什么。如果只是在按钮上加点图片,弄个背景,应该不太难吧。
但是,那些布局,尺寸神马的,如果单靠自己写,以及跑代码修改的话,感觉效率太低了。我想看看能不能提高效率。 还有,就是,有的自带的控件,我觉得不好看,我想自己PS制作那些控件,再导入进去。[/quote] 更换皮肤,或者自定义皮肤的问题,看司马的博客: http://blog.csdn.net/sunyiz/article/details/7595371 PS的话,做出来的效果是固定像素大小的,而控件本身大小是不固定的,在这方面,Swing 本身没有提供类似 Android 里面的九宫格智能缩放机制,可以自己实现,也可以做成矢量图,然后找第三方库来把矢量图转化成Graphics2D代码,不过那需要你对 Java G2D 和 Swing 的 LNF 机制非常熟悉,如果楼主没有打算花很多时间去深入学习Swing的话,还是去找现成的 Look & Feel 来用吧。 [/quote] 现成的Look & Feel ,也是一些做好的插件?
heartlc 2013-08-13
  • 打赏
  • 举报
回复
引用 30 楼 raistlic 的回复:
[quote=引用 29 楼 heartlc 的回复:] [quote=引用 28 楼 fortheother 的回复:] 你要说说你要做什么。如果只是在按钮上加点图片,弄个背景,应该不太难吧。
但是,那些布局,尺寸神马的,如果单靠自己写,以及跑代码修改的话,感觉效率太低了。我想看看能不能提高效率。 还有,就是,有的自带的控件,我觉得不好看,我想自己PS制作那些控件,再导入进去。[/quote] 别的框架我不知道,Swing的话,我觉得“拖拉拽效率比手写代码高”是一种误解,不管是学习效率还是工作效率。 学习效率,手写代码需要你熟悉常用布局的用法,拖拉拽在此基础上又需要你熟悉GUI Editor的操作方式,以及各种细微操作对应的代码原型。 工作效率,手写代码可以让你在脑中想象的同时通过代码精确控制其中的层面、位置关系,并且代码比较整齐,变量名称可读性比较好,还可以把布局过程中用到的“中间Container”定义成局部变量,“用过就忘”; GUI Editor拖拉拽的时候可能是快了,其中细微的层次和精确到像素的位置关系却需要你花时间去挨个调整,变量名如果不手动一个一个去改的话,生成的代码很难看很难读,并且可能有一些限制(比如 Netbeans 的 GUI Editor 要求,你托拽上去的任何控件必须有空参数的构造方法,有时为了托拽,你甚至去要去改动控件的源码……)。从长远的维护来看,我是宁愿维护别人的手写代码,也不愿意维护GUI Editor生成的代码的。另外一般GUI Editor与某种IDE绑定,如果将来项目换了别的IDE,你的“所见即所得”就没了,只剩下可读性很差的代码。[/quote] 我可不可以这么理解,就是,使用代码写界面,可以将脑中的想象,通过代码表达出来,这样的话,锻炼了自己的编程能力。同时,也更好地进行维护。
raistlic 2013-08-13
  • 打赏
  • 举报
回复
司马那篇博客列出了一些 Swing 内建的 LNF, 比如 Nimbus:


这里列出了一些第三方的 Look & Feel,
http://stackoverflow.com/questions/3954616/java-look-and-feel-lf
raistlic 2013-08-13
  • 打赏
  • 举报
回复
引用 32 楼 heartlc 的回复:
我可不可以这么理解,就是,使用代码写界面,可以将脑中的想象,通过代码表达出来,这样的话,锻炼了自己的编程能力。同时,也更好地进行维护。
是的,我是这么认为的。
引用 33 楼 heartlc 的回复:
现成的Look & Feel ,也是一些做好的插件?
Look & Feel 就是 皮肤,是给一整套的 UI 类起一个名字,“插件”的定义我不清楚,Look & Feel 是 Swing 内建的机制,你所看到的每一个 Swing 控件, JButton, JLabel, JTextField ... 等等,它们每一个都是被一个 UI 类绘制出来的,套用不同风格的皮肤,会给它们帮定不同风格的 UI 类,最终绘制出来的样子也就不同,具体可以看楼上的链接。
Wuerselen 2013-08-13
  • 打赏
  • 举报
回复
最近坛子你好多Swing的界面问题,有点糊涂,难道SWT落伍了? Swing难道有过质的飞越了? 太久没有用java做界面了。 各位大神说说看呢? 现在的Swing和SWT的优缺点都在哪里? 谢谢 要做Desktop GUI 推荐QT C++,ui tool 和 qml 非常易用强大。
raistlic 2013-08-12
  • 打赏
  • 举报
回复
引用 29 楼 heartlc 的回复:
[quote=引用 28 楼 fortheother 的回复:] 你要说说你要做什么。如果只是在按钮上加点图片,弄个背景,应该不太难吧。
但是,那些布局,尺寸神马的,如果单靠自己写,以及跑代码修改的话,感觉效率太低了。我想看看能不能提高效率。 还有,就是,有的自带的控件,我觉得不好看,我想自己PS制作那些控件,再导入进去。[/quote] 更换皮肤,或者自定义皮肤的问题,看司马的博客: http://blog.csdn.net/sunyiz/article/details/7595371 PS的话,做出来的效果是固定像素大小的,而控件本身大小是不固定的,在这方面,Swing 本身没有提供类似 Android 里面的九宫格智能缩放机制,可以自己实现,也可以做成矢量图,然后找第三方库来把矢量图转化成Graphics2D代码,不过那需要你对 Java G2D 和 Swing 的 LNF 机制非常熟悉,如果楼主没有打算花很多时间去深入学习Swing的话,还是去找现成的 Look & Feel 来用吧。
raistlic 2013-08-12
  • 打赏
  • 举报
回复
引用 29 楼 heartlc 的回复:
[quote=引用 28 楼 fortheother 的回复:] 你要说说你要做什么。如果只是在按钮上加点图片,弄个背景,应该不太难吧。
但是,那些布局,尺寸神马的,如果单靠自己写,以及跑代码修改的话,感觉效率太低了。我想看看能不能提高效率。 还有,就是,有的自带的控件,我觉得不好看,我想自己PS制作那些控件,再导入进去。[/quote] 别的框架我不知道,Swing的话,我觉得“拖拉拽效率比手写代码高”是一种误解,不管是学习效率还是工作效率。 学习效率,手写代码需要你熟悉常用布局的用法,拖拉拽在此基础上又需要你熟悉GUI Editor的操作方式,以及各种细微操作对应的代码原型。 工作效率,手写代码可以让你在脑中想象的同时通过代码精确控制其中的层面、位置关系,并且代码比较整齐,变量名称可读性比较好,还可以把布局过程中用到的“中间Container”定义成局部变量,“用过就忘”; GUI Editor拖拉拽的时候可能是快了,其中细微的层次和精确到像素的位置关系却需要你花时间去挨个调整,变量名如果不手动一个一个去改的话,生成的代码很难看很难读,并且可能有一些限制(比如 Netbeans 的 GUI Editor 要求,你托拽上去的任何控件必须有空参数的构造方法,有时为了托拽,你甚至去要去改动控件的源码……)。从长远的维护来看,我是宁愿维护别人的手写代码,也不愿意维护GUI Editor生成的代码的。另外一般GUI Editor与某种IDE绑定,如果将来项目换了别的IDE,你的“所见即所得”就没了,只剩下可读性很差的代码。
heartlc 2013-08-11
  • 打赏
  • 举报
回复
引用 28 楼 fortheother 的回复:
你要说说你要做什么。如果只是在按钮上加点图片,弄个背景,应该不太难吧。
但是,那些布局,尺寸神马的,如果单靠自己写,以及跑代码修改的话,感觉效率太低了。我想看看能不能提高效率。 还有,就是,有的自带的控件,我觉得不好看,我想自己PS制作那些控件,再导入进去。
2013-08-11
  • 打赏
  • 举报
回复
你要说说你要做什么。如果只是在按钮上加点图片,弄个背景,应该不太难吧。
黎某人 2013-08-11
  • 打赏
  • 举报
回复

我是win8,可以调成系统样式,可以参考UIManager

UIManager.put("Label.font", new Font("微软雅黑", Font.PLAIN, 16));
UIManager.put("Button.font", new Font("微软雅黑", Font.PLAIN, 16));
UIManager.put("swing.boldMetal", Boolean.FALSE);
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
紫威剩人阚雷 2013-08-11
  • 打赏
  • 举报
回复
勉强用SWT,千万别用Swing.不知是谁出的馊主意,让你用Java做UI。 我以前搞过,累得B歪眼斜.... 。要做桌面程序,还是.Net或者Delphi
yanxing2012 2013-08-10
  • 打赏
  • 举报
回复
网上有一些开源的基于swing组件的类库
heartlc 2013-08-10
  • 打赏
  • 举报
回复
引用 23 楼 KEZHENXU 的回复:
可以用eclipse加个插件,界面就容易做了,最后你可以设置一下lookandfeel,貌似有一个外观很漂亮,有点像苹果系统的主题
、 有这个插件的名字吗?
heartlc 2013-08-10
  • 打赏
  • 举报
回复
引用 19 楼 xinggg 的回复:
看你是想用JAVA写CS程序还是BS程序, 如果是CS程序,建议你用netbeans+swing,所见即所得操作,跟用.NET开发差不多 如果是BS程序,你的选择就多了,可以用dreamware做界面,或者直接用富客户端的JS框架,例如 EXTJS之类的
我想写的是CS程序! 我用Myeclipse做,也是自己拉控件的,但是,觉得它自带的控件不好看,所以,想自己搞搞美工,但是又没看过这方面的资料,所以,想问一下。
kezhenxu94 2013-08-10
  • 打赏
  • 举报
回复
可以用eclipse加个插件,界面就容易做了,最后你可以设置一下lookandfeel,貌似有一个外观很漂亮,有点像苹果系统的主题
  • 打赏
  • 举报
回复
Myeclipse 不是免费么 楼上的搞什么
joyment2010 2013-08-10
  • 打赏
  • 举报
回复
顶,学习
搬运工木木 2013-08-09
  • 打赏
  • 举报
回复
看你是想用JAVA写CS程序还是BS程序, 如果是CS程序,建议你用netbeans+swing,所见即所得操作,跟用.NET开发差不多 如果是BS程序,你的选择就多了,可以用dreamware做界面,或者直接用富客户端的JS框架,例如 EXTJS之类的
heartlc 2013-08-09
  • 打赏
  • 举报
回复
引用 16 楼 wangbylove 的回复:
美工没先设计好界面么
不是,是我自己没事想试试,学点东西。
加载更多回复(17)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧