📄 phonebookgui.java
字号:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.io.Serializable;
//顺序表(建立、插入、删除、修改、查找、排序、合并)
class List implements Serializable{
String name;
Data data[];
int len;
final int maxLen;
List(String name,int maxLen){
this.name=name;
this.maxLen=maxLen;
data=new Data[maxLen];
len=0;
}
void ins(int i,Data d) throws Exception{
if (find(d.getName())!=-1){
throw new Exception("该姓名已存在");
}
if(len == maxLen){
throw new Exception("顺序表已满无法插入");
}
if(i<0||i>len){
throw new Exception("超出范围");
}
for(int j=len;j>i;j--)
data[j] = data[j-1];
data[i] = d;
len++;
}
public void del(int i) throws Exception{
if(len ==0){
throw new Exception("顺序表已空无法删除");
}
if(i<0||i>len-1){
throw new Exception("超出范围");
}
for(int j=i;j<len-1;j++)
data[j] = data[j+1];
len--;
}
public void set(int i,Data d) throws Exception{
int f=find(d.getName());
if (f!=-1&&f!=i){
throw new Exception("该姓名已存在");
}
if(i<0||i>len-1){
throw new Exception("超出范围");
}
data[i]=d;
}
int find(String n){
for (int i=0;i<len;i++){
if (data[i].getName().compareTo(n)==0)
return i;
}
return -1;
}
public void sort(){
for (int i=0;i<len-1;i++){
for (int j=0;j<len-i-1;j++){
if (data[j].getName().compareTo(data[j+1].getName())>0){
Data temp=data[j];
data[j]=data[j+1];
data[j+1]=(temp);
}
}
}
}
public List merge(List a,List b) throws Exception {
List c=new List("",a.len+b.len+40);
a.sort();b.sort();
int i=0,j=0;
while (i<a.len&&j<b.len){
int s=a.data[i].getName().compareTo(b.data[j].getName());
if (s<0){
c.ins(c.len,a.data[i]);
i++;
}else if(s==0){
c.ins(c.len,a.data[i]);
i++;j++;
}else{
c.ins(c.len,b.data[j]);
j++;
}
}
while (i<a.len){
c.ins(c.len,a.data[i]);
i++;
}
while (j<b.len){
c.ins(c.len,b.data[j]);
j++;
}
return c;
}
}
//数据元素
class Data implements Serializable{
private String name;
private int tel;
Data(String name,int tel){
this.name=name;
this.tel=tel;
}
void setName(String name){this.name=name; }
String getName(){return name;}
void setTel(int tel){this.tel=tel;}
int getTel(){return tel;}
}
public class PhoneBookGUI implements ActionListener{
JFrame frame;
JScrollPane c;
JPanel e,flow;
JButton b[]=new JButton[8];
String titleString[]={"插入","删除","修改","查找","排序","合并","载入","保存"};
MyTable mt;
JTable t;
JFileChooser fileChooser = new JFileChooser("D:\\");;
int result;
List list=new List("未命名",32);
PhoneBookGUI(){
frame=new JFrame("孙宏达的电话本v0.8");
mt=new MyTable();
t=new JTable(mt);
t.setPreferredScrollableViewportSize(new Dimension(212,10));
c = new JScrollPane(t);
e=new JPanel();
flow=new JPanel();
e.setLayout(new GridLayout(4,2,5,5));
for (int i=0;i<8;i++){
b[i]=new JButton(titleString[i]);
b[i].addActionListener(this);
e.add(b[i]);
}
flow.add(e);
frame.getContentPane().add(c, BorderLayout.CENTER);
frame.getContentPane().add(flow,BorderLayout.EAST);
frame.pack();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
frame.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e){
String cmd=e.getActionCommand();
if (cmd=="插入"){
new insDialog(frame);
}else if (cmd=="删除"){
int c=t.getSelectedRowCount();
int select[]=t.getSelectedRows();
for (int i=c-1;i>=0;i--){
try{
list.del(select[i]);
}catch(Exception exp){}
}
mt.fireTableDataChanged();
}else if (cmd=="修改"){
int c=t.getSelectedRowCount();
try{
if (c<1){
throw new Exception("请选中一个项目");
}else if(c>1){
throw new Exception("一次只能改一个项目");
}else{
new setDialog(frame);
}
}catch(Exception exp){
new errorDialog(exp);
}
}else if (cmd=="查找"){
new findDialog(frame);
}else if (cmd=="排序"){
list.sort();
mt.fireTableDataChanged();
}else if (cmd=="载入"){
File file=null;
fileChooser.setDialogTitle("载入");
result = fileChooser.showOpenDialog(frame);
if (result == JFileChooser.APPROVE_OPTION){
file = fileChooser.getSelectedFile();
try {
ObjectInputStream in = new ObjectInputStream(
new FileInputStream(file));
list= (List)in.readObject();
in.close();
}catch (Exception exception){
new errorDialog(exception);
}
mt.fireTableDataChanged();
}
}else if (cmd=="保存"){
File file=null;
fileChooser.setDialogTitle("保存");
result = fileChooser.showSaveDialog(frame);
if (result == JFileChooser.APPROVE_OPTION){
file = fileChooser.getSelectedFile();
try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(file));
out.writeObject(list);
out.close();
}catch (Exception exception){
new errorDialog(exception);
}
}
}else if (cmd=="合并"){
File file=null;
List list2=null;
fileChooser.setDialogTitle("合并");
result = fileChooser.showOpenDialog(frame);
if (result == JFileChooser.APPROVE_OPTION){
file = fileChooser.getSelectedFile();
try {
ObjectInputStream in = new ObjectInputStream(
new FileInputStream(file));
list2= (List)in.readObject();
in.close();
list=list.merge(list,list2);
}catch (Exception exp){
new errorDialog(exp);
}
mt.fireTableDataChanged();
}
}
}
class MyTable extends AbstractTableModel{
String[] n = {"姓名","电话"};
public int getColumnCount() {
return n.length;
}
public int getRowCount() {
return list.len;
}
public String getColumnName(int col) {
return n[col];
}
public Object getValueAt(int row, int col) {
switch(col){
case 0:return list.data[row].getName();
case 1:return list.data[row].getTel();
default:return "";
}
}
}
class myDialog implements ActionListener{
JDialog dialog;
JPanel p=new JPanel();
JButton
ok=new JButton("确定"),
cancel=new JButton("取消");
JLabel
namel=new JLabel("姓名:"),
tell=new JLabel("电话:");
JTextField
nametf=new JTextField(7),
teltf=new JTextField(7);
void launch(){
p.add(namel);
p.add(nametf);
p.add(tell);
p.add(teltf);
p.add(ok);
p.add(cancel);
ok.addActionListener(this);
cancel.addActionListener(this);
dialog.add(p);
dialog.setSize(140,120);
dialog.setResizable(false);
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
}
void action()throws Exception{};
public void actionPerformed(ActionEvent event){
String cmd=event.getActionCommand();
if (cmd=="确定"){
try{
action();
}catch(NumberFormatException exp){
new errorDialog(new Exception("电话为整数"));
}catch(Exception exp){
new errorDialog(exp);
}
}else if (cmd=="取消"){
dialog.dispose();
}
}
}
class insDialog extends myDialog{
insDialog(JFrame f){
dialog=new JDialog(frame,"插入",true);
launch();
}
void action()throws Exception{
list.ins(list.len,new Data(nametf.getText(),Integer.parseInt(teltf.getText())));
nametf.setText("");
teltf.setText("");
mt.fireTableDataChanged();
}
}
class setDialog extends myDialog{
int select[]=t.getSelectedRows();
setDialog(JFrame f){
dialog=new JDialog(f,"修改",true);
nametf.setText(list.data[select[0]].getName());
teltf.setText(Integer.toString(list.data[select[0]].getTel()));
launch();
}
void action()throws Exception{
String name=nametf.getText();
String tel=teltf.getText();
list.set(select[0],new Data(name,Integer.parseInt(tel)));
mt.fireTableDataChanged();
dialog.dispose();
}
}
class findDialog extends myDialog{
findDialog(JFrame f){
dialog=new JDialog(f,"查找",true);
teltf.setEditable(false);
launch();
}
void action()throws Exception{
int index=list.find(nametf.getText());
if(index==-1){
throw new Exception("没有找到!");
}else{
teltf.setText(Integer.toString(list.data[index].getTel()));
}
}
}
class errorDialog implements ActionListener{
JDialog dialog;
JPanel p;
JButton ok=new JButton("确定");
errorDialog(Exception e){
dialog=new JDialog(frame,"错误!",true);
p=new JPanel();
ok=new JButton("确定");
p.add(new JLabel(e.getMessage()));
p.add(ok);
ok.addActionListener(this);
dialog.add(p);
dialog.pack();
dialog.setResizable(false);
dialog.setLocationRelativeTo(frame);
dialog.setResizable(false);
dialog.setVisible(true);
}
void action(){};
public void actionPerformed(ActionEvent event){
String cmd=event.getActionCommand();
if (cmd=="确定"){dialog.dispose();}
}
}
public static void main(String[] args) {
new PhoneBookGUI();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -