27.5.4 话单维护模块
话单维护模块主要实现以下几个功能:话单重命名、对方姓名维护、前缀码维护、归属地维护和关联分析。
在介绍这些功能时,采用一种固定的模式,即首先介绍实现该功能的算法描述,简单的功能会给出涉及的控件,复杂的功能给出算法流程图和实现算法的详细代码,这样使读者可以把握各种功能是如何实现的,对将来设计开发软件提供一个参考。
1.话单重命名维护
选择当前要打开的一个话单(该话单在JTabbedPane面板上使用JTable对象实现),然后“单击”工具栏上的重命名工具则弹出如图27.20所示的对话框,当前话单的名字就显示在该对话框中,用户只需要在该对话框中输入新的表单名字,就可实现修改功能。该功能涉及一行代码:
window.tabpane.setTitleAt(window.getn(),jTextField1.getText());
该代码在实现重命名对话框的类中,该类会调用主窗口对象的JTabbedPane对象,在用户选择的子面板上设置名字为用户输入的字符串即通过jTextField1.getText()获得的字符串。
图 27.20 重命名话单对话框
说明 图27.20中表单名文本框中已经显示了“贾六.xls”,该名字是从打开的话单中自动获得的,涉及该话单的程序可参考图27.24所示。下面设计的话单维护都是以图27.24所示的话单维护为例说明。
2.对方姓名维护
其功能是将用户指定的号码与号码的使用者对应起来,并且对当前所有话单中的该号码对应的姓名信息都同时更改。这里只给出一个流程,因为不设计复杂的算法,也不再给出详细的代码以节省篇幅。流程如图27.21所示。
图 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.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.23 关联分析对话框
至此,读者应该了解了整个软件的设计和实现过程,在设计完成后,笔者根据系统的功能对软件实现了模块划分,这样对每个模块的功能实现了具体的定义,在实现时就容易把握,实现各个击破了。而对于模块中功能的实现关键是算法的实现,算法从宏观上说是实现某种功能的思想,该思想通过具体的代码实现,这就实现了使用某种语言编写的软件功能模块。
【运行结果】程序运行结果如图27.24所示,并打开了两个话单,话单名字分别为“王五.xls”和“贾六.xls”。
当然在编译环境中设计程序,只能供编写者自己调试或使用。软件的发行需要一些工具来打包编写的代码,使得程序可以安装在用户的主机上。27.6节将介绍如何打包发行软件,及其程序的运行测试。
图 27.24 程序运行结果