27.5.4 话单维护模块

话单维护模块主要实现以下几个功能:话单重命名、对方姓名维护、前缀码维护、归属地维护和关联分析。

在介绍这些功能时,采用一种固定的模式,即首先介绍实现该功能的算法描述,简单的功能会给出涉及的控件,复杂的功能给出算法流程图和实现算法的详细代码,这样使读者可以把握各种功能是如何实现的,对将来设计开发软件提供一个参考。

1.话单重命名维护

选择当前要打开的一个话单(该话单在JTabbedPane面板上使用JTable对象实现),然后“单击”工具栏上的重命名工具则弹出如图27.20所示的对话框,当前话单的名字就显示在该对话框中,用户只需要在该对话框中输入新的表单名字,就可实现修改功能。该功能涉及一行代码:


window.tabpane.setTitleAt(window.getn(),jTextField1.getText());


该代码在实现重命名对话框的类中,该类会调用主窗口对象的JTabbedPane对象,在用户选择的子面板上设置名字为用户输入的字符串即通过jTextField1.getText()获得的字符串。

27.5.4 话单维护模块 - 图1

图 27.20 重命名话单对话框

说明 图27.20中表单名文本框中已经显示了“贾六.xls”,该名字是从打开的话单中自动获得的,涉及该话单的程序可参考图27.24所示。下面设计的话单维护都是以图27.24所示的话单维护为例说明。

2.对方姓名维护

其功能是将用户指定的号码与号码的使用者对应起来,并且对当前所有话单中的该号码对应的姓名信息都同时更改。这里只给出一个流程,因为不设计复杂的算法,也不再给出详细的代码以节省篇幅。流程如图27.21所示。

27.5.4 话单维护模块 - 图2

图 27.21 姓名维护的流程图

3.前缀码维护

【实例27.16】该功能实现清除当前话单中的前缀码,如下所示。


01 private void updatetable(){

02 //搜索所有当前的话单

03 for(int i=0;i<window.tabpane.getTabCount();i++){

04 JTable shoujitable=((JTable)window.shoujitablemap.get(Integer.toString(i)));

05 int countrow=shoujitable.getRowCount();

06 for(int j=0;j<countrow;j++){

07 String rowdata=shoujitable.getValueAt(j,2).toString();

08 for(int l=0;l<window.currentguhuaqianzhui.length;l++){

09 String selectednumber=window.currentguhuaqianzhui[l];

10 //判断号码是否以用户欲清除的前缀匹配,如果匹配则清除该前缀并修改该号码

11 if(rowdata.toString().startsWith(selectednumber)){

12 rowdata=rowdata.toString().substring(selectednumber.length(),

13 rowdata.toString().length());

14 shoujitable.setValueAt(rowdata, j,2);

15 }

16 }

17 }

18 //更新表视图

19 shoujitable.repaint();

20 }

21 }


【代码说明】算法思想是对用户输入的前缀依次在当前话单的号码中搜索,一旦发现则清除该前缀。该功能涉及一个更新表方法,该方法的思想是对每一个话单中的对方号码依次匹配要删除的前缀,如果相同则删除该前缀并重新设置该号码的值,如果不是则不处理继续搜索。直到搜索完整个话单列表。

【运行效果】前缀码维护对话框如图27.22所示。

4.归属地维护

【实例27.17】该功能实现对对方号码归属地的更新或修改。该操作在笔者设计的MaintainphoneArea类中,以下示例了类中主要的部分代码。


27.5.4 话单维护模块 - 图3

图 27.22 前缀码维护对话框

01 public class MaintainphoneArea extends Thread{

02……

03 //在构造函数中实现加载并链接数据库

04 public MaintainphoneArea(){

05 try{

06 //加载数据库驱动程序

07 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

08 }

09 catch(ClassNotFoundException ex){

10 ex.printStackTrace();

11 }

12 //通过数据源url链接数据库

13 String url="jdbc:odbc:test";

14 try{

15 conn=DriverManager.getConnection(url);

16 stmt=conn.createStatement();

17 }

18 catch(SQLException ex){

19 ex.printStackTrace();

20 }

21 }

22 //该方法实现数据库中号码对应的归属地更新,基本思路是先删除该条记录再插入一条新的

23 //记录来实现修改或更新数据记录

24 public void UpdateDB()throws SQLException{

25 ResultSet rs=stmt.executeQuery("select area from list where num="+"'"+number+"'");

26 if(rs.next()){

27 String deletestr="DELETE FROM list where num='"+number+"'";

28 stmt.executeUpdate(deletestr);

29 String updatestr="INSERT INTO list(num, area)VALUES('"+number+"','"+area+"')";

30 stmt.executeUpdate(updatestr);

31 }

32 else{

33 String updatestr="INSERT INTO list(num, area)VALUES('"+number+"','"+area+"')";

34 stmt.executeUpdate(updatestr);

35 }

36 //最后读数据库操作,关闭数据库链接,释放链接占用的内存资源

37 stmt.close();

38 conn.close();

39 }

40 //启动该线程就是运行run()方法体中的代码

41 public void run(){

42 try{

43 this.UpdateDB();

44 }catch(SQLException ex){

45 ex.printStackTrace();

46 }

47 }

48 }


【代码说明】该段代码的算法思想是用户一旦更新某个号码的归属地,程序首先会修改当前打开的所有话单与该号码对应的归属地信息,然后在数据库中修改,该操作涉及了数据库操作。此处详细介绍与数据库操作的实现。

5.关联分析

该功能实现在多个话单中查找对方号码同时出现的通话记录。其算法思想是用户指定一个关联号码,程序在当前所有打开的话单中搜索与该号码对应的记录,并把记录添加到新的话单表中。实现该功能不涉及复杂的算法,所以这里不详细介绍该功能的具体实现。但用户单击“关联”工具,会弹出如图27.23所示的对话框。

27.5.4 话单维护模块 - 图4

图 27.23 关联分析对话框

至此,读者应该了解了整个软件的设计和实现过程,在设计完成后,笔者根据系统的功能对软件实现了模块划分,这样对每个模块的功能实现了具体的定义,在实现时就容易把握,实现各个击破了。而对于模块中功能的实现关键是算法的实现,算法从宏观上说是实现某种功能的思想,该思想通过具体的代码实现,这就实现了使用某种语言编写的软件功能模块。

【运行结果】程序运行结果如图27.24所示,并打开了两个话单,话单名字分别为“王五.xls”和“贾六.xls”。

当然在编译环境中设计程序,只能供编写者自己调试或使用。软件的发行需要一些工具来打包编写的代码,使得程序可以安装在用户的主机上。27.6节将介绍如何打包发行软件,及其程序的运行测试。

27.5.4 话单维护模块 - 图5

图 27.24 程序运行结果