电话簿简单实现(JAVA,带图形界面文件读取)

电话簿简单实现(JAVA,带图形界面文件读取),第1张

电话簿简单实现(JAVA,带图形界面文件读取)

PS:文件保存在“D://name.txt”;需要修改在window类第31行。

jar程序下载

Friend类:

import java.io.*;
import java.util.Iterator;

public class Friend implements Serializable{//对象
	public String name,sex,phone,relation;//姓名,性别,电话号码,关系
	public Friend(Friend friend) {//构造方法,对象
		this.sex     =friend.sex;
		this.name    =friend.name;
		this.phone   =friend.phone;
		this.relation=friend.relation;
	}
	public Friend(String name,String sex,String phone,String relation) {//构造方法,变量
		sex.     replace(" ", "");
		name.    replace(" ", "");
		phone.   replace(" ", "");
		relation.replace(" ", "");
		this.sex     =new String(sex);
		this.name    =new String(name);
		this.phone   =new String(phone);
		this.relation=new String(relation);
		if (relation.length()==0) {
			relation=new String(" ");
		}
	}
	@Override
	public boolean equals(Object obj) {
		return this.name.equals(((Friend)obj).name);
	}
	@Override
	public String toString() {
		return name+" "+sex+" "+phone+" "+relation;
	}
}
class SFriend {//储存对象Friend的集合
	public String surname;//姓
	public Friend[] friend;
	public SFriend(Friend friend) {//构造方法,创建
		this.surname=friend.name.substring(0, 1);
		this.friend=new Friend[1];
		this.friend[0]=new Friend(friend);
	}
	public SFriend(SFriend sf) {//构造方法,对象
		this.surname=sf.surname;
		this.friend=sf.friend;
	}
	public SFriend(String str) {//构造方法,变量
		this.surname=str;
		this.friend=new Friend[0];
	}
	@Override
		public String toString() {
			return surname;
		}
	//添加方法
	void addF(Friend friend) {
		Friend[] fnew=new Friend[this.friend.length+1];
		for (int i = 0; i < this.friend.length; i++) {//全部移动
			fnew[i]=this.friend[i];
		}
		fnew[this.friend.length]=new Friend(friend);//最后添加
		this.friend=fnew;//替换
	}
	//删除方法
	void deleteF(Friend friend) {
		int a=this.seekF(friend);//寻找相同的
		Friend[] fnew =new Friend[this.friend.length-1];
		for (int j = 0; j < a; j++) {//前部
			fnew[j]=this.friend[j];
		}
		for (int j = a; j < fnew.length; j++) {//后部
			fnew[j]=this.friend[j+1];
		}
		this.friend=fnew;//替换
		return ;//结束
	}
	//寻找方法
	int seekF(Friend f){
		for (int i = 0; i < this.friend.length; i++) {
			if(this.friend[i].equals(f)) {
				return i;
			}
		}
		return -1;
	}
	//排序方法
	void soreF(int x) {
		Friend f;//中继
		boolean a=true;
		if(x==0) {//姓名
			while(a) {
				a=false;
				for (int i = 1; i < this.friend.length; i++) {
					if (this.friend[i-1].name.compareTo(this.friend[i].name)<0) {
						f=this.friend[i-1];
						this.friend[i-1]=this.friend[i];
						this.friend[i]=f;
						a=true;
					}
				}
			}
		}
		else {//关系
			while(a) {
				a=false;
				for (int i = 1; i < this.friend.length; i++) {
					if (this.friend[i-1].relation.compareTo(this.friend[i].relation)<0) {
						f=this.friend[i-1];
						this.friend[i-1]=this.friend[i];
						this.friend[i]=f;
						a=true;
					}
				}
			}
		}
	}
	//查找方法
	void lookup(String s,int n) {
		Friend f;//中继
		int a=0;//计数
		if(n==0){//姓名
			for (int i = 0; i < this.friend.length; i++) {
				if(this.friend[i].name.contains(s)) {//是子串
					f=this.friend[a];
					this.friend[a]=this.friend[i];
					this.friend[i]=f;
					a++;
				}
			}
		}
		else {//电话
			for (int i = 0; i < this.friend.length; i++) {
				if(this.friend[i].phone.contains(s)) {//是子串
					f=this.friend[a];
					this.friend[a]=this.friend[i];
					this.friend[i]=f;
					a++;
				}
			}
		}
	}
}
class SSFriend {//储存对象SFriend的集
	public SFriend[] sFriend;
	public SSFriend() {//构造方法,初始
		this.sFriend=new SFriend[1];
		this.sFriend[0]=new SFriend("全部");
	}
	//添加fiend方法
	void addF(Friend friend) {
		if(this.sFriend[0].seekF(friend)==-1) {//全部没有
			int a=this.seekSf(friend.name.substring(0, 1));
			this.sFriend[0].addF(friend);
			if(a==-1) {//没有姓
				this.addSf(new SFriend(friend));//新建
			}
			else {
				this.sFriend[a].addF(friend);
			}
		}
	}
	//添加sFiend方法
		void addSf(SFriend sf) {
			SFriend[] sfnew=new SFriend[this.sFriend.length+1];
			for (int i = 0; i < this.sFriend.length; i++) {//全部移动
				sfnew[i]=this.sFriend[i];
			}
			sfnew[this.sFriend.length]=new SFriend(sf);//最后添加
			this.sFriend=sfnew;//替换

		}
	//删除fiend方法
	void deleteF(int row,int n) {
		Friend f=new Friend(this.sFriend[row].friend[n]);
		int a=seekSf(f.name.substring(0, 1));
		this.sFriend[0].deleteF(f);
		this.sFriend[a].deleteF(f);
		if(this.sFriend[a].friend.length==0) {
			this.deleteSf(f.name.substring(0, 1));
		}
	}
	//删除SFiend方法
	void deleteSf(String s) {
		SFriend[] sf=new SFriend[this.sFriend.length-1];
		int a=seekSf(s);
		for (int i = 0; i < a; i++) {
			sf[i]=this.sFriend[i];
		}
		for (int i = a; i < sf.length; i++) {
			sf[i]=this.sFriend[i+1];
		}
		this.sFriend=sf;
	}
	//寻找方法
	int seekSf(String s) {
		for (int i = 0; i < this.sFriend.length; i++) {
			if(this.sFriend[i].surname.equals(s)) {
				return i;
			}
		}
		return -1;
	}
}

window类:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.*;
import java.io.*;
import java.util.*;

public class window extends Jframe implements 
	ActionListener,ListSelectionListener,ChangeListener{
	Scanner sc=new Scanner(System.in);
//	组件
	JTextField name,phone,relation;//姓名,电话,关系 文本行
	JComboBox lookup,sort;//查找,排序 组合框
	JButton add,delete,open,servation;//添加,删除,打开,保存 按钮
	JRadioButton boy,girl;//男,女 单选按钮
	ButtonGroup sex;//性别 单选按钮组
	JCheckBox autosave;//自动保存 复选框
	JSpinner time;//保存时间 微调文本行
	DefaultTableModel tableModel;//表格模型
	JTable table;//表格
	DefaultListModel listModel;//列表模型
	JList list;//列表
	JScrollPane scrollPane1,scrollPane2;//滚动窗格
	JSplitPane sp1,sp2;//分割窗格
//	变量
	String filename="D://name.txt";
	File     file;
	SSFriend ssFriend;
	autoSave as=new autoSave(10);
	int row=0;
	
//	构造方法
	public window() {
		super("电话簿");
		this .setSize (820, 280);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//		变量
		ssFriend=new SSFriend();
//		组件---------------------------------------
//		文本行
		name    =new JTextField(16);
		phone   =new JTextField(16);
		relation=new JTextField(16);
		name.    setText("姓名");
		phone.   setText("12345678910");
		relation.setText("关系");
//		组合框
		lookup=new JComboBox();
		lookup.addItem("姓名");
		lookup.addItem("电话");
		sort  =new JComboBox();
		sort  .addItem("姓名");
		sort  .addItem("关系");
		lookup.addActionListener(this);
		sort  .addActionListener(this);
//		按钮
		add      =new JButton("添加");
		delete   =new JButton("删除");
		open     =new JButton("打开");
		servation=new JButton("保存");
		add      .addActionListener(this);
		delete   .addActionListener(this);
		open     .addActionListener(this);
		servation.addActionListener(this);
//		单选按钮
		boy= new JRadioButton("男",true);
		girl=new JRadioButton("女");
//		单选按钮组
		sex= new ButtonGroup();
		sex.add(boy );
		sex.add(girl);
//		复选框
		autosave=new JCheckBox("自动保存");
		autosave.addActionListener(this);
//		微调文本行
		time=new JSpinner(new SpinnerNumberModel(10, 1, 60, 1));
		time.addChangeListener(this);
//		表格模型
		String[] str={"姓名","性别","电话号码","关系"};
		tableModel=new DefaultTableModel(str,0);
//		表格
		table=new JTable(tableModel);
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//		列表模型
		listModel=new DefaultListModel();
		tolistModel();
//		列表
		list=new JList(listModel);
		list.addListSelectionListener(this);
//		滚动窗口
		scrollPane1=new JScrollPane(list);
		scrollPane2=new JScrollPane(table);
		
//		分割窗格
		sp1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
		sp2=new JSplitPane(JSplitPane.VERTICAL_SPLIT);
		sp1.setDividerLocation(110);
		sp2.setDividerLocation(120);
		sp1.add(scrollPane1);sp1.add(sp2);
		JPanel panel1=new JPanel(),
				panel2=new JPanel(),
				panel3=new JPanel();//面板
		panel1.setLayout(new GridLayout(2, 1));
		panel2.setBorder(new TitledBorder
				(new EtchedBorder(), "Friend"));
		panel2.add(name);
		panel2.add(boy);panel2.add(new JLabel("       "));
		panel2.add(girl);panel2.add(new JLabel("      "));
		panel2.add(phone);panel2.add(relation);
		panel3.add(add);panel3.add(delete);
		panel3.add(new JLabel("查找关键字"));panel3.add(lookup);
		panel3.add(new JLabel("排序关键字"));panel3.add(sort);
		panel3.add(open);panel3.add(servation);
		panel3.add(autosave);panel3.add(time);
		panel3.add(new JLabel("分钟"));
		panel1.add(panel2);panel1.add(panel3);
		sp2.add(scrollPane2);sp2.add(panel1);
		sp1.setoneTouchExpandable(false);
		sp2.setoneTouchExpandable(false);
//		
		this.add(sp1);
		this.setVisible(true);
	}
//	事件监听器
	@Override
	public void actionPerformed(ActionEvent e) {
//		添加
		if (e.getSource()==add      ) {
			if(phone.getText().length()==11) {
				Friend f=new Friend(name.getText(),boy.isSelected()?boy.getText():girl.getText(),phone.getText(),relation.getText());
				ssFriend.addF(f);//添加
				tolistModel();//列表重置
				list.setSelectedIndex(0);//列表选全部
				totableModel();
			}else JOptionPane.showMessageDialog(this, "电话不正确");
		}else
//		删除
		if (e.getSource()==delete   ) {
			if(row!=-1&&table.getSelectedRow()!=-1) {
				ssFriend.deleteF(row, table.getSelectedRow());//删除
				tolistModel();//列表重置
				list.setSelectedIndex(0);//列表选全部
				totableModel();
			}
		}else
//		打开
		if (e.getSource()==open     ) {
			route();
			open();
			tolistModel();//列表重置
			list.setSelectedIndex(0);//列表选全部
			totableModel();
		}else
//		保存
		if (e.getSource()==servation) {
			route();
			servation();
		}else
//		自动保存
		if(e.getSource()==autosave  ) {
			if(autosave.isSelected()) {//选中
				as.n=(int)(time.getValue());
				as.start();
			}else {//取消选中
				as.interrupt();
			}
		}else
//		查找
		if (e.getSource()==lookup   ) {
			int n=lookup.getSelectedIndex();
			String s=new String();
			if(n==0) {
				s=name.getText();
				ssFriend.sFriend[0].lookup(s,n);
			}else {
				s=phone.getText();
				ssFriend.sFriend[0].lookup(s,n);
			}
			list.setSelectedIndex(0);//列表选全部
			totableModel();
		}else
//		排序
		if (e.getSource()==sort     ) {
			for (int i = 0; i < ssFriend.sFriend.length; i++) {
				ssFriend.sFriend[i].soreF(sort.getSelectedIndex());//排序
			}
			list.setSelectedIndex(0);//列表选全部
			totableModel();
		}
	}
//	列表事件
	@Override
	public void valueChanged(ListSelectionEvent e) {
		row=list.getSelectedIndex();
		totableModel();
	}
//	微调文本框事件
	@Override
	public void stateChanged(ChangeEvent e) {
		as.n=(int)(time.getValue());
	}
//	文件路径选择
	void route() {
		filename=JOptionPane.showInputDialog(this,"文件路径",filename);

	}
//	打开文件,弹出对话框
	void open() {
		//文件路径选择
		if(filename!=null) {//选择路径完毕
			file=new File(filename);
			if(!file.exists()) {//文件不存在提示
				JOptionPane.showMessageDialog(this,"文件不存在。");
			}else {
				try {
				InputStream in = new FileInputStream(file);//字节输入流
		        ObjectInputStream obj=new ObjectInputStream(in);//对象输入流
		        ssFriend=new SSFriend();//删除所有对象
		        while(true) {
		        	try {
						ssFriend.addF((Friend)obj.readObject());
					} catch (EOFException e) {//文件读到尾结束
						break;
					}
		        }
		        in .close();//关闭字节输入流
		        obj.close();//关闭对象输入流
				}catch (Exception e) {
					JOptionPane.showMessageDialog(this,"错误。");
				}
			}
		}
	}
//	保存文件
	void servation() {
		//文件路径选择
		if(filename!=null) {//选择路径完毕
			file=new File(filename);
			if(file.exists()) {//文件存在
				file.delete();
			}
			try {
				file.createNewFile();
				OutputStream out=new FileOutputStream(file);//字节输出流
				ObjectOutputStream obj=new ObjectOutputStream(out);//文件输出流
				for (int i = 0; i < ssFriend.sFriend[0].friend.length; i++) {
					obj.writeObject(ssFriend.sFriend[0].friend[i]);
				}
				out.close();//关闭字节输出流
		        obj.close();//关闭对象输出流
			} catch (Exception e) {
			}
		}
	}
//	到列表模型
	void tolistModel(){
		listModel.removeAllElements();
		for (int i = 0; i < ssFriend.sFriend.length; i++) {
			listModel.addElement(ssFriend.sFriend[i].surname);
		}
	}
//	到表格模型
	void totableModel() {
		if(row!=-1) {
			tableModel.setRowCount(0);
			for (int i = 0; i < ssFriend.sFriend[row].friend.length; i++) {
				String[] s={ssFriend.sFriend[row].friend[i].name ,
							ssFriend.sFriend[row].friend[i].sex,
							ssFriend.sFriend[row].friend[i].phone,
							ssFriend.sFriend[row].friend[i].relation};
				tableModel.addRow(s);
			}
		}
	}
//	保存线程
	class autoSave extends Thread{
		int a=0,n;
		public autoSave(int n) {
			this.n=n;
		}
		@Override
		public void run() {
			try {
				while(true){//循环
					for(a=0;a 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5672135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存