继明哥的否决之后,java泰又出新作!明哥接码
上次做那个系统是swing+jdbc实现的,无奈被明哥一句否定,数据库连接完全体现不了数据结构的作用,哎,这就是向小弟施加压力呀。人无压力不出油,经过10天的努力,终于李刚的通讯录更新为1.1版本!
以下为设计思路,以及具体报告
————————————————————————————————————————————————————
李刚的通讯录设计实验报告
——信管1132班江锦泰
1)题目
李刚是一爱折腾的人,当然爱折腾的人均有梦想,他想当中国的盖次呢。可不,现在个人好友信息多了,复杂了,他想制作一个个人通讯录的制作管理软件。 刚好这个学期学了数据结构课,所以他准备使用数据结构知识来实现了。并考虑使用双向链表作数据结构。并制定了初步要求:(1)每个好友信息包含姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日等。
(2)作为一个完整的系统,应具有友好的界面和较强的容错能力
2)需求分析
一、运到相关数据结构基础——双链表
二、不能运动数据库,即需要用到文件IO流,把人物信息记录到相关文件当中
三、需要有增删查基本功能
四、良好的交互界面
四、较好的容错能力
3)概念结构设计
人物={姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日}
姓名为码,电话为码(key)
4)逻辑结构设计
一、双链表,具体比较难实现,所以开展联想,双链表—>树—>以树为数据结构的集合(以下简称树集)。
二、信息存到树集。
三、树集存到data文件
四、文件—>树集—>改动数据—>文件
5)物理结构设计
一、建立data文件
二、构造人物类
三、构造树集成为人物类的集合
四、构造良好的交互界面
6)系统实现与测试
简单的一个包,AddressListTreeSet为树集
Person类里面含有人物属性集合
ShowJFrame为主界面
dat为存放人物信息的文件
这是主界面,左边是一个JList姓氏导航,下面是一个功能面板,其中,按姓名查找与按电话号码查找会读取姓名框与电话框的内容
单击导航框会跳转
添加按钮作用,如果任何一个输入为空,会报错,支持输入不知道
点击下来横杠,点击按姓名查找会进行查询
电话号码同理不做效果图
删除效果,选中任意一个,进行删除,结束后读入data
7)优缺点自我评价
一、AddressList1.1失去了1.0版本的界面美化性,也减少了界面的层数二、缺少了修改功能,因实现比较复杂,时间又不可允许,故..
三、自己没有充分利用好时间,总是在晚上编程
四、图形交互界面以及数据结构部分内容还是不扎实,做的时候经常要看书,看****,缺少效率
8)代码展示,放码过去!明哥接码!
package com.friend; import java.io.Serializable; import java.util.Comparator; public class PersonClass implements Comparable<PersonClass>,Comparator<PersonClass>,Serializable{ /** * */ private static final long serialVersionUID = -262413201900983336L; String name,phonecode,sex,address,zip_code,old,qq,blog,birthday; public PersonClass(String name,String phonecode,String sex,String address,String zip_code,String old,String qq,String blog,String birthday){ this.name=name; this.phonecode=phonecode; this.sex=sex; this.address=address; this.zip_code=zip_code; this.old=old; this.qq=qq; this.blog=blog; this.birthday=birthday; } public PersonClass(String element[]){ name=element[0]; phonecode=element[1]; sex=element[2]; address=element[3]; zip_code=element[4]; old=element[5]; qq=element[6]; blog=element[7]; birthday=element[8]; System.out.print(birthday); } public Object[] toArray(){ Object[] vars = new Object[9]; vars[0]=name; vars[1]=this.phonecode; vars[2]=this.sex; vars[3]=this.address; vars[4]=this.zip_code; vars[5]=this.old; vars[6]=this.qq; vars[7]=this.blog; vars[8]=this.birthday; return vars; } public String index(){ return this.name.substring(0, 1); } @Override public int compareTo(PersonClass o) { // TODO 自动生成的方法存根 if(this.name!=o.name){ return this.name.compareTo(o.name); } if(this.phonecode!=o.phonecode){ return this.phonecode.compareTo(o.phonecode); } if(this.sex!=o.sex){ return this.sex.compareTo(o.sex); } if(this.address!=o.address){ return this.address.compareTo(o.address); } if(this.zip_code!=o.zip_code){ return this.zip_code.compareTo(o.zip_code); } if(this.old!=o.old){ return this.old.compareTo(o.old); } if(this.qq!=o.qq){ return this.qq.compareTo(o.qq); } if(this.blog!=o.blog){ return this.blog.compareTo(o.blog); } return this.birthday.compareTo(o.birthday); } @Override public int compare(PersonClass o1, PersonClass o2) { // TODO 自动生成的方法存根 return o1.name.compareTo(o2.name); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhonecode() { return phonecode; } public void setPhonecode(String phonecode) { this.phonecode = phonecode; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getZip_code() { return zip_code; } public void setZip_code(String zip_code) { this.zip_code = zip_code; } public String getOld() { return old; } public void setOld(String old) { this.old = old; } public String getQq() { return qq; } public void setQq(String qq) { this.qq = qq; } public String getBlog() { return blog; } public void setBlog(String blog) { this.blog = blog; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } } class IndexComparator implements Comparator<PersonClass>{ public int compare(PersonClass f1, PersonClass f2){ return f1.index().compareTo(f2.index()); } } class CodeComparator implements Comparator<PersonClass>{ public int compare(PersonClass f1, PersonClass f2){ return f1.phonecode.compareTo(f2.phonecode); } }
package com.friend; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; public class AddressListTreeSet extends TreeSet<PersonClass>{ /** * */ private static final long serialVersionUID = -673031400092308095L; private String filename; public AddressListTreeSet(String filename){ super(); this.filename=filename; this.readFromFile(); } public void readFromFile(){ try{ FileInputStream fin = new FileInputStream(this.filename); ObjectInputStream objin=new ObjectInputStream(fin); while(true) try{ this.add((PersonClass)objin.readObject()); } catch (Exception e){ break; } objin.close(); fin.close(); } catch (IOException ioe){ System.out.print("集合为空"); } } public void writeToFile(){ try{ FileOutputStream fout = new FileOutputStream(this.filename); ObjectOutputStream objout= new ObjectOutputStream(fout); Iterator<PersonClass>it=this.iterator(); while(it.hasNext()) { PersonClass f=it.next(); System.out.print(f.toString()); objout.writeObject(f); } objout.close(); fout.close(); System.out.print("写入成功"); } catch(IOException ioe){ System.out.print(ioe); } } public PersonClass search(PersonClass x,Comparator<PersonClass> c){ Iterator<PersonClass>it= this.iterator(); while(it.hasNext()){ PersonClass f= it.next(); if(c.compare(f,x)==0) return f; } return null; } }
package com.friend; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.Comparator; import java.util.Iterator; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; public class ShowJFrame extends JFrame implements ListSelectionListener, ActionListener,WindowListener{ /** * */ private static final long serialVersionUID = -7933446592390771790L; private AddressListTreeSet book; private JList<String> list; private DefaultListModel<String> listModel; private JTable table; private DefaultTableModel tableModel; private JComboBox<Object> combobox_name; private DefaultComboBoxModel<Object> comboModel; private JTextField text_code; private JTextField text_sex; private JTextField text_address; private JTextField text_zipcode; private JTextField text_old; private JTextField text_qq; private JTextField text_blog; private JTextField text_birth; public ShowJFrame(String filename){ super("通讯录"); this.setBounds(250,100,941,362); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.addWindowListener(this); JSplitPane split_h=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); split_h.setDividerLocation(40); this.getContentPane().add(split_h); JSplitPane split_v=new JSplitPane(JSplitPane.VERTICAL_SPLIT); split_v.setDividerLocation(180); this.book= new AddressListTreeSet(filename); this.listModel=new DefaultListModel<String>(); this.listModel.addElement("全部"); this.list=new JList<String>(listModel); this.list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.list.addListSelectionListener(this); split_h.add(new JScrollPane(this.list)); split_h.add(split_v); String[] columns={ "姓名","电话号码","性别","地址","邮编","年龄","QQ","微信帐号","生日" // name,phonecode,sex,address,zip_code,old,qq,blog,birthday }; this.tableModel=new DefaultTableModel(columns,0); this.table=new JTable(tableModel); this.list.setSelectedIndex(0); split_v.add(new JScrollPane(table)); JPanel friendpanel=new JPanel(new GridLayout(2,1)); split_v.add(friendpanel); JPanel panels[]={new JPanel(),new JPanel()}; for(int i=0;i<panels.length;i++){ friendpanel.add(panels[i]); } panels[0].add(new JLabel(columns[0])); this.comboModel=new DefaultComboBoxModel<Object>(); combobox_name=new JComboBox<Object>(this.comboModel); combobox_name.setEnabled(true); combobox_name.setEditable(true); panels[0].add(combobox_name); panels[0].add(new JLabel(columns[1])); this.text_code=new JTextField("12345678901",12); panels[0].add(text_code); panels[0].add(new JLabel(columns[2])); this.text_sex=new JTextField("男",2); panels[0].add(text_sex); panels[0].add(new JLabel(columns[3])); this.text_address=new JTextField("12345678901",25); panels[0].add(text_address); panels[0].add(new JLabel(columns[4])); this.text_zipcode=new JTextField("521000",6); panels[0].add(text_zipcode); panels[0].add(new JLabel(columns[5])); this.text_old=new JTextField("21",2); panels[0].add(text_old); panels[0].add(new JLabel(columns[6])); this.text_qq=new JTextField("12345678901",12); panels[0].add(text_qq); panels[0].add(new JLabel(columns[7])); this.text_blog=new JTextField("12345678901",12); panels[0].add(text_blog); panels[0].add(new JLabel(columns[8])); this.text_birth=new JTextField("12345678901",12); panels[0].add(text_birth); this.addIndex(); String buttonstr[]={"添加","按姓名查找","按电话号码查找","删除行"}; JButton buttons[]=new JButton[buttonstr.length]; for(int i=0;i<buttons.length;i++){ buttons[i]=new JButton(buttonstr[i]); panels[1].add(buttons[i]); buttons[i].addActionListener(this); } this.setVisible(true); } private void addIndex(){ Iterator<PersonClass>it=this.book.iterator(); while(it.hasNext()){ String indexstr=it.next().index(); if(!this.listModel.contains(indexstr)){ this.listModel.addElement(indexstr); this.comboModel.addElement(indexstr); } } } @Override public void windowOpened(WindowEvent e) {} @Override public void windowClosing(WindowEvent e) { this.book.writeToFile(); System.out.print("写出程序启动"); } @Override public void windowClosed(WindowEvent e) {} @Override public void windowIconified(WindowEvent e) {} @Override public void windowDeiconified(WindowEvent e) {} @Override public void windowActivated(WindowEvent e) {} @Override public void windowDeactivated(WindowEvent e) {} @Override public void actionPerformed(ActionEvent e) { String name=(String)combobox_name.getSelectedItem(); String code=text_code.getText(); String sex=text_sex.getText(); String address=text_address.getText(); String zipcode=text_zipcode.getText(); String old=text_old.getText(); String qq=text_qq.getText(); String blog=text_blog.getText(); String birth=text_birth.getText(); if(e.getActionCommand().equals("添加")){ PersonClass f = new PersonClass(name,code,sex,address,zipcode,old,qq,blog,birth); if(name==null){ JOptionPane.showMessageDialog(this, "不能添加姓名为空对象"); } else if(!name.equals("")){ this.book.add(f); String surname=f.index(); if(list.getSelectedValue().equals(surname)) tableModel.addRow(f.toArray()); else{ if(!listModel.contains(surname)){ listModel.addElement(surname); comboModel.addElement(surname); } list.setSelectedValue(surname, true); } } else { JOptionPane.showMessageDialog(this, "不能添加姓名空串或重复对象"+f.toString()); } } if(!this.book.isEmpty()&&e.getActionCommand().endsWith("查找")){ for(int i=tableModel.getRowCount()-1;i>=0;i--) this.tableModel.removeRow(i); if(e.getActionCommand().equals("按姓名查找")) this.addAll(new PersonClass(name,"","","","","","","",""),new PersonClass(name,"","","","","","","","")); else{ PersonClass find=this.book.search(new PersonClass("",code,"","","","","","",""), new CodeComparator()); if(find!=null) this.tableModel.addRow(find.toArray()); } return; } if(e.getActionCommand().equals("删除行")){ if(this.book.isEmpty()) JOptionPane.showMessageDialog(this,"表格空,不能删除数据项。"); else{ int i=table.getSelectedRow(); if(i==-1) JOptionPane.showMessageDialog(this,"请选择数据项"); else{ name=(String)table.getValueAt(i, 0); int yes=JOptionPane.showConfirmDialog(null, "删除\""+name+"\"行?"); if(yes==0){ code=(String)table.getValueAt(i, 1); sex=(String)table.getValueAt(i, 2); address=(String)table.getValueAt(i, 3); zipcode=(String)table.getValueAt(i, 4); old=(String)table.getValueAt(i, 5); qq=(String)table.getValueAt(i, 6); blog=(String)table.getValueAt(i, 7); birth=(String)table.getValueAt(i, 8); System.out.print(birth); PersonClass f=new PersonClass(name,code,sex,address,zipcode,old,qq,blog,birth); this.book.remove(f); tableModel.removeRow(i); if(this.book.search(f, new IndexComparator())==null){ listModel.removeElement(f.index()); comboModel.removeElement(f.index()); } } } } } } @Override public void valueChanged(ListSelectionEvent e) { String surname=(String)list.getSelectedValue(); if(!this.book.isEmpty()&&surname!=null&&surname!=""){ for(int i= this.tableModel.getRowCount()-1;i>=0;i--) this.tableModel.removeRow(i); if(surname=="全部") this.addAll(); else this.addAll(new PersonClass(surname,"","","","","","","",""),new IndexComparator()); } } private void addAll(PersonClass friend,Comparator<PersonClass> c){ Iterator<PersonClass> it =this.book.iterator(); while(it.hasNext()){ PersonClass f= it.next(); if(c==null||c.compare(friend,f)==0) this.tableModel.addRow(f.toArray()); } } private void addAll(){ this.addAll(null,null); } public static void main(String args[]){ new ShowJFrame("E:\\作业本\\AddressList1.1\\src\\data\\通讯录.dat"); } }