继明哥的否决之后,java泰又出新作!明哥接码

继明哥的否定之后,java泰又出新作!明哥接码!

上次做那个系统是swing+jdbc实现的,无奈被明哥一句否定,数据库连接完全体现不了数据结构的作用,哎,这就是向小弟施加压力呀。人无压力不出油,经过10天的努力,终于李刚的通讯录更新为1.1版本!

以下为设计思路,以及具体报告

————————————————————————————————————————————————————

李刚的通讯录设计实验报告

——信管1132班江锦泰

1)题目

李刚是一爱折腾的人,当然爱折腾的人均有梦想,他想当中国的盖次呢。可不,现在个人好友信息多了,复杂了,他想制作一个个人通讯录的制作管理软件。 刚好这个学期学了数据结构课,所以他准备使用数据结构知识来实现了。并考虑使用双向链表作数据结构。并制定了初步要求:


(1)每个好友信息包含姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日等。


(2)作为一个完整的系统,应具有友好的界面和较强的容错能力

2)需求分析

一、运到相关数据结构基础——双链表

二、不能运动数据库,即需要用到文件IO流,把人物信息记录到相关文件当中

三、需要有增删查基本功能

四、良好的交互界面

四、较好的容错能力

3)概念结构设计

人物={姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日

姓名为码,电话为码(key)

4)逻辑结构设计

一、双链表,具体比较难实现,所以开展联想,双链表—>树—>以树为数据结构的集合(以下简称树集)。

二、信息存到树集。

三、树集存到data文件

四、文件—>树集—>改动数据—>文件

5)物理结构设计

一、建立data文件

二、构造人物类

三、构造树集成为人物类的集合

四、构造良好的交互界面

6系统实现与测试

继明哥的否决之后,java泰又出新作!明哥接码

简单的一个包,AddressListTreeSet为树集

Person类里面含有人物属性集合

ShowJFrame为主界面

dat为存放人物信息的文件继明哥的否决之后,java泰又出新作!明哥接码

这是主界面,左边是一个JList姓氏导航,下面是一个功能面板,其中,按姓名查找与按电话号码查找会读取姓名框与电话框的内容继明哥的否决之后,java泰又出新作!明哥接码

单击导航框会跳转

继明哥的否决之后,java泰又出新作!明哥接码

添加按钮作用,如果任何一个输入为空,会报错,支持输入不知道

继明哥的否决之后,java泰又出新作!明哥接码

点击下来横杠,点击按姓名查找会进行查询

电话号码同理不做效果图

继明哥的否决之后,java泰又出新作!明哥接码

删除效果,选中任意一个,进行删除,结束后读入data继明哥的否决之后,java泰又出新作!明哥接码

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");
	}
}