PS:文件保存在“D://name.txt”;需要修改在window类第31行。
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;
}
}
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<String> listModel;//列表模型
JList<SFriend> 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<String>();
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<n;a++) {
Thread.sleep(60000);//一分钟
}
servation();//保存
}
} catch (Exception e) {
}
}
}
public static void main(String[] args) {
new window();
}
}