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;//表格 DefaultListModellistModel;//列表模型 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 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)