最近与小团队的一个项目刚刚结束,静下心来写点东西,顺便说说自己在项目中的一些经验体会!
软件:珠三角地区水质信息的分析处理系统
开发语言:Java
所用知识点:Swing、JFreeChart、百度地图API、报表API、Excel API、JDBC等
项目中我负责的主要工作是软件界面的设计、布局以及代码的实现,还有一些逻辑功能的实现。下面附上该软件的一些截图:
图1 软件主界面
图2 作图功能展示
图3 百度地图API功能调用
由于小团队是第一次参与项目开发,所以很多东西没有规范下来,包括需求分析文档和设计文档,都没有统一的规范,所以项目过程中根据需求变化而做的修改比较多,代码组织起来比较乱。
上面提到,项目中我主要负责的是软件界面的设计、以及布局,众所周知,Java的GUI界面设计布局是很麻烦的,用MyEclipse的拖动布局插件工具进行布局,生成的代码比较长,因此在项目中所有的界面布局都是手工完成的。
一、Java Swing 布局经验:
1. 结合布局使用:
单一的布局不可能实现一个比较完善的界面,那么合理的做法是通过多种布局的嵌套来实现一个界面
2. 布局推荐:
Java中布局很多,下面介绍这个项目中用的最多的布局:
(1) BorderLayout:把界面分为东、西、南、北、中5块区域(上面主界面就是利用这个布局的嵌套来完成的)
(2) FlowLayout:以流水式的形式来放置控件(使用这个布局的一个麻烦的地方在于无法手动控制换行放置,这里可以通过设置面板的大小以及各组件的大小来使之换行)
(3) GroupLayout: 这个布局用起来比较麻烦(MyEclipse的拖动设计Swing界面工具用的默认布局就是它),相关资料比较少,所以用起来不太方便
(4) CardLayout:这个布局对于制作“步骤面板”非常有用,“步骤面板”即是需要点击下一步或者上一步来进行视图切换的一种面板。
以上布局在项目中用的比较多,相关资料都是根据API 或者 一些论坛得到的,对Swing 有兴趣的码友们可以关注下。
3. 在布局的基础上美化界面:
当实现完布局之后,就可以进行界面的一些美化工作,Java Swing的一个重大特色是它以比较优雅的方式支持L&F(Look and Feel)。项目我采用的是一个开源的Swing美化工具Substance.jar,利用简单的几行代码,对界面进行美化。
4. 布局优于美工:
我们必须相信,大多数程序员是没有美感的,因此,在界面设计中程序员应该注重的是布局,而不要把重心放在,这个控件用什么图片来装饰,弄什么渐变等等。
二、分层思想在Swing中的体现:
Swing是源于MVC架构实现的,使用它来进行客户端软件的开发能够比较好的做到实现分层。
项目中对代码的组织进行了分层,包括DAO层、Service层和View层,界面设计是View层,但是我们知道Swing中的事件监听正是实现C层的关键。注册一个事件代表即将实现一个逻辑功能。那么很自然的我们会把大量逻辑跟界面设计的类写在一起,这样会造成一个类文件代码量很大的情况,并且不利于项目小组的分工合作,因此,本项目中把界面设计类与事件注册响应逻辑实现分开,这样利于小组之间开发的进度。
打个比方,MainFrame.java里面有一个按钮,这个按钮需的逻辑需要大量代码来实现,那么不应该在MainFrame.java里面出现这些逻辑代码,比较合理的做法是,实现一个监听响应的类(class MyAction implements ActionListener),并且实现一个逻辑类(class MyService),在MainFrame.java里面的按钮注册该监听xxBtn.addActionListener(new MyAction()),MyAction里面调用逻辑实现(MyService),如果涉及数据库操作,那么逻辑实现还需要调用DAO层(在MyService里面调用MyDAO)。
通过上面的方法对代码进行整合会比较方便,也便于阅读,最重要的还是便于小组分工实现。
三、项目经验教训
上面说到,我们这个项目是在需求分析文档、设计文档没有成型的基础上开发的,所以开发过程中经常遇到需求变更,代码的变动比较大。这一点在真正的企业开发中是致命的。所以,在真正的软件开发中,切勿着急写代码。
1. 美工先行
美工,或者界面设计师可以先动手,把软件界面雏形搭好,在需求分析阶段可以根据客户的需求进行修改),应该在需求分析清楚,设计文档规范下来以后,才开始动手
2. 应付需求
每隔一段时间最好向客户汇报进展,给客户展示软件,因为往往在开发中会遇到客户需求不断改变的情况,那么这个时候能够提前了解需求,就能够降低软件开发的成本消耗(当然包括时间、人力资源等等)。
3. 调试工作应该做好
尽量早地进行单元测试,并且每隔一定阶段进行模块功能测试,确保测试工作做到位,不要在给客户演示软件的时候出现任何的BUG。在软件交付之前应该把所有的功能都测试通过。
以上便是这次项目开发过程中所总结的一些点,第一次写博客,写得很乱,希望我说的这些点对于一些还没有进行项目开发的码友们有一点帮助。
PS: 题外话
或许有一些会说Java Swing不适合做GUI界面,但是,我想说的是,最适合自己的东西,才是最合理的,并且Swing的一些特性很好,虽然用它来实现界面布局很繁琐,开发效率比较低,但是它的实现思想是很好的。有人嫌Swing丑,但是我觉得进行一些美化工作之后,Swing不比C#那些写出来的界面难看。也有人说Swing慢,但是我认为,只要正确处理好EDT线程,耗时的操作不要放在EDT线程上,界面更新操作一定要放在EDT线程上,那么Swing的响应速度,不会慢到哪里去。
我喜欢用Swing,喜欢自己写代码来实现布局,不喜欢用拖动工具,那不是一个程序员该做的。