package A2;
public class AddressBookApplication {
public static void main(String[] args) {
AddressBookGUI addressBookGUI = new AddressBookGUI();
addressBookGUI.loadAddressBook();
Runtime.getRuntime().addShutdownHook(new Thread(addressBookGUI::saveAddressBook));
}
}
loadAddressBook() 方法用于加载地址簿数据,进行以下操作:
使用 ObjectInputStream 对象输入流,并以文件流 FileInputStream 作为参数进行初始化,将地址簿从文件中读取。
将读取到的地址簿数据转换为 ArrayList<Person> 类型,并赋值给变量 addressBook。
遍历 addressBook 中的每个 Person 对象,并将姓名和类别拼接成字符串形式,添加到 listModel 列表模型中。
打印输出 "地址簿数据加载成功!"。
捕获可能抛出的 FileNotFoundException 异常,如果文件不存在,则创建一个新的空地址簿 ArrayList 并赋值给 addressBook 变量,然后打印输出 "地址簿文件不存在,已创建新地址簿!"。
捕获可能抛出的 IOException 和 ClassNotFoundException 异常,打印输出 "地址簿数据加载失败:" 加上异常信息。
saveAddressBook() 方法用于保存地址簿数据,进行以下操作:
使用 ObjectOutputStream 对象输出流,并以文件流 FileOutputStream 作为参数进行初始化,将地址簿数据写入文件。
使用 oos.writeObject(addressBook) 将 addressBook 中的数据写入文件。
打印输出 "地址簿数据保存成功!"。
捕获可能抛出的 IOException 异常,打印输出 "地址簿数据保存失败:" 加上异常信息。
该段代码主要实现了从文件中加载地址簿数据并显示到列表模型中,并将地址簿数据保存到文件中。当文件不存在时会创建一个新的空地址簿。通过这些方法可以实现地址簿的持久化存储和读取功能。
package A2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.util.ArrayList;
class AddressBookGUI extends JFrame implements ActionListener {
private ArrayList<Person> addressBook;//地址簿数据
private final JList<String> personList;//人员列表
private final DefaultListModel<String> listModel;
private final JTextField nameField;//姓名输入框
private final JTextField phoneNumberField;//电话输入框
private final JTextField emailField;//邮箱输入框
private final JComboBox<String> categoryComboBox;//关系下拉框
public AddressBookGUI() {
addressBook = new ArrayList<>();//初始化地址簿
listModel = new DefaultListModel<>();
personList = new JList<>(listModel);//初始化人员列表
JLabel nameLabel = new JLabel("姓名:");//姓名标签
JLabel phoneNumberLabel = new JLabel("电话:");//电话标签
JLabel emailLabel = new JLabel("Email:");//邮箱标签
JLabel categoryLabel = new JLabel("关系:");//关系标签
nameField = new JTextField(20);//姓名输入框
phoneNumberField = new JTextField(20);//电话输入框
emailField = new JTextField(20);//邮箱输入框
String[] categories = {"朋友", "家人", "同事"};//关系选项
categoryComboBox = new JComboBox<>(categories);//关系下拉框
JButton addButton = new JButton("增加");//增加按钮
JButton deleteButton = new JButton("删除");//删除按钮
addButton.addActionListener(this);//添加点击事件监听器
deleteButton.addActionListener(this);//添加点击事件监听器
JPanel inputPanel = new JPanel(new GridLayout(5, 2));//输入信息面板,使用网格布局
inputPanel.add(nameLabel);// 添加姓名标签到面板
inputPanel.add(nameField);// 添加姓名输入框到面板
inputPanel.add(phoneNumberLabel);// 添加电话标签到面板
inputPanel.add(phoneNumberField); // 添加电话输入框到面板
inputPanel.add(emailLabel);// 添加邮箱标签到面板
inputPanel.add(emailField);// 添加邮箱输入框到面板
inputPanel.add(categoryLabel); // 添加关系标签到面板
inputPanel.add(categoryComboBox); // 添加关系下拉框到面板
inputPanel.add(addButton);// 添加增加按钮到面板
inputPanel.add(deleteButton); // 添加删除按钮到面板
JScrollPane scrollPane = new JScrollPane(personList); // 创建滚动面板并将人员列表添加到其中
setLayout(new BorderLayout()); // 设置布局为边界布局
add(inputPanel, BorderLayout.NORTH);
add(scrollPane, BorderLayout.CENTER);
//双击人员列表弹出详细信息对话框
personList.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2 && personList.getSelectedValue() != null) {
int selectedIndex = personList.getSelectedIndex();
Person selectedPerson = addressBook.get(selectedIndex);
String phoneNumber = selectedPerson.getPhoneNumber();
String email = selectedPerson.getEmail();
//弹出对话框显示电话和邮箱信息
JOptionPane.showMessageDialog(AddressBookGUI.this, "电话: " + phoneNumber + "\nEmail: " + email);
}
}
});
setTitle("地址簿");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//释放当前窗口
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("增加")) {
String name = nameField.getText();
String phoneNumber = phoneNumberField.getText();
String email = emailField.getText();
String category = (String) categoryComboBox.getSelectedItem();
Person person = new Person(category, name, phoneNumber, email);
addressBook.add(person);
listModel.addElement(name + " (" + category + ")");
// 重置输入内容
nameField.setText("");
phoneNumberField.setText("");
emailField.setText("");
saveAddressBook(); // 保存到文件
} else if (e.getActionCommand().equals("删除")) {
int selectedIndex = personList.getSelectedIndex();
if (selectedIndex != -1) {
addressBook.remove(selectedIndex);
listModel.remove(selectedIndex);
saveAddressBook(); // 保存到文件
}
}
}
//使用对象输出流+
public void loadAddressBook() {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("addressbook.txt"))) {
addressBook = (ArrayList<Person>) ois.readObject();
for (Person person : addressBook) {
listModel.addElement(person.getName() + " (" + person.getCategory() + ")");
}
System.out.println("地址簿数据加载成功!");
} catch (FileNotFoundException e) {
addressBook = new ArrayList<>(); // 如果文件不存在,则创建新的地址簿
System.out.println("地址簿文件不存在,已创建新地址簿!");
} catch (IOException | ClassNotFoundException e) {
System.out.println("地址簿数据加载失败:" + e.getMessage());
}
}
public void saveAddressBook() {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("addressbook.txt"))) {
oos.writeObject(addressBook);
System.out.println("地址簿数据保存成功!");
} catch (IOException e) {
System.out.println("地址簿数据保存失败:" + e.getMessage());
}
}
}
定义了一个名为"Person"的类,并实现了Serializable接口,表示该类的实例可以被序列化(即可以在网络或存储介质之间传输或持久化存储)。
成员变量:
private final String category: 表示人员的类别,使用字符串类型保存。
private final String name: 表示人员的姓名,使用字符串类型保存。
private final String phoneNumber: 表示人员的手机号码,使用字符串类型保存。
private final String email: 表示人员的电子邮件地址,使用字符串类型保存。
构造方法:public Person(String category, String name, String phoneNumber, String email)
构造方法用于创建Person类的实例,并接受四个参数:category、name、phoneNumber和email。
将传入的参数赋值给对应的成员变量。
成员方法:
public String getCategory(): 返回人员的类别。
public String getName(): 返回人员的姓名。
public String getPhoneNumber(): 返回人员的手机号码。
public String getEmail(): 返回人员的电子邮件地址。
总结:这段代码定义了一个简单的Person类,用于表示人员对象,包含了类别、姓名、手机号码和电子邮件等属性,并提供了相应的访问方法。
package A2;
import java.io.*;
class Person implements Serializable {
//成员变量
private final String category;
private final String name;
private final String phoneNumber;
private final String email;
//构造方法
public Person(String category, String name, String phoneNumber, String email) {
this.category = category;
this.name = name;
this.phoneNumber = phoneNumber;
this.email = email;
}
//成员方法
public String getCategory() {
return category;
}
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public String getEmail() {
return email;
}
}