Java 个人通讯录 GUI 应用:管理您的联系人信息
这是一个使用 Java Swing 开发的个人通讯录 GUI 应用,可以方便地添加、修改、删除和保存联系人信息。该应用还支持将联系人数据保存到文件并读取。
代码结构
package system;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
class Contact implements Serializable {
private String name;
private String birthDate;
private String phoneNumber;
private String email;
private String notes;
public Contact(String name, String birthDate, String phoneNumber, String email, String notes) {
this.name = name;
this.birthDate = birthDate;
this.phoneNumber = phoneNumber;
this.email = email;
this.notes = notes;
}
// Getters and setters
public String getName() {
return name;
}
public String getBirthDate() {
return birthDate;
}
public void setBirthDate(String birthDate) {
this.birthDate = birthDate;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
}
public class PersonalAddressBookGUI extends JFrame implements ActionListener {
private static final String DATA_FILE_PATH = 'D:\address.ini';
private ArrayList<Contact> contacts;
private int currentContactIndex;
private int mode;
private JTextField nameTextField, birthDateTextField, phoneNumberTextField, emailTextField, notesTextField;
private JTextArea addressBookTextArea;
public PersonalAddressBookGUI() {
contacts = new ArrayList<>();
currentContactIndex = -1;
mode = 0; // Default to browse mode
loadContactsFromFile();
// Initialize UI components
JLabel nameLabel = new JLabel('姓名:');
JLabel birthDateLabel = new JLabel('出生日期:');
JLabel phoneNumberLabel = new JLabel('手机:');
JLabel emailLabel = new JLabel('电子邮件:');
JLabel notesLabel = new JLabel('备注:');
nameTextField = new JTextField(20);
birthDateTextField = new JTextField(20);
phoneNumberTextField = new JTextField(20);
emailTextField = new JTextField(20);
notesTextField = new JTextField(20);
addressBookTextArea = new JTextArea(10, 30);
addressBookTextArea.setEditable(false);
JButton newButton = new JButton('新建');
JButton modifyButton = new JButton('修改');
JButton saveButton = new JButton('保存');
JButton deleteButton = new JButton('删除');
JButton exitButton = new JButton('退出');
newButton.addActionListener(this);
modifyButton.addActionListener(this);
saveButton.addActionListener(this);
deleteButton.addActionListener(this);
exitButton.addActionListener(this);
// Set initial UI state
updateUIState();
// Create UI layout
JPanel infoPanel = new JPanel(new GridLayout(5, 2));
infoPanel.add(nameLabel);
infoPanel.add(nameTextField);
infoPanel.add(birthDateLabel);
infoPanel.add(birthDateTextField);
infoPanel.add(phoneNumberLabel);
infoPanel.add(phoneNumberTextField);
infoPanel.add(emailLabel);
infoPanel.add(emailTextField);
infoPanel.add(notesLabel);
infoPanel.add(notesTextField);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
buttonPanel.add(newButton);
buttonPanel.add(modifyButton);
buttonPanel.add(saveButton);
buttonPanel.add(deleteButton);
buttonPanel.add(exitButton);
JPanel addressBookPanel = new JPanel(new BorderLayout());
addressBookPanel.setBorder(BorderFactory.createTitledBorder('通讯录'));
addressBookPanel.add(new JScrollPane(addressBookTextArea), BorderLayout.CENTER);
Container container = getContentPane();
container.setLayout(new BorderLayout());
container.add(infoPanel, BorderLayout.CENTER);
container.add(buttonPanel, BorderLayout.SOUTH);
container.add(addressBookPanel, BorderLayout.EAST);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle('个人通讯录');
pack();
setLocationRelativeTo(null); // Center the frame on the screen
setResizable(false);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();
if (actionCommand.equals('新建')) {
mode = 1; // Switch to add mode
clearFields();
updateUIState();
} else if (actionCommand.equals('修改')) {
mode = 2; // Switch to modify mode
updateUIState();
} else if (actionCommand.equals('保存')) {
if (validateFields()) {
if (mode == 1) {
addContact();
} else if (mode == 2) {
modifyContact();
}
saveContactsToFile();
mode = 0; // Switch back to browse mode
updateUIState();
updateAddressBookTextArea();
}
} else if (actionCommand.equals('删除')) {
deleteContact();
saveContactsToFile();
mode = 0; // Switch back to browse mode
updateUIState();
updateAddressBookTextArea();
} else if (actionCommand.equals('退出')) {
saveContactsToFile();
System.exit(0);
}
}
private void updateUIState() {
boolean isBrowseMode = (mode == 0);
nameTextField.setEditable(!isBrowseMode);
birthDateTextField.setEditable(!isBrowseMode);
phoneNumberTextField.setEditable(!isBrowseMode);
emailTextField.setEditable(!isBrowseMode);
notesTextField.setEditable(!isBrowseMode);
}
private void clearFields() {
nameTextField.setText('');
birthDateTextField.setText('');
phoneNumberTextField.setText('');
emailTextField.setText('');
notesTextField.setText('');
}
private boolean validateFields() {
String name = nameTextField.getText();
String birthDate = birthDateTextField.getText();
String phoneNumber = phoneNumberTextField.getText();
String email = emailTextField.getText();
if (name.isEmpty()) {
JOptionPane.showMessageDialog(this, '姓名不能为空', '验证错误', JOptionPane.ERROR_MESSAGE);
return false;
}
// Perform additional validation for birthDate, phoneNumber, and email if needed
return true;
}
private void addContact() {
String name = nameTextField.getText();
String birthDate = birthDateTextField.getText();
String phoneNumber = phoneNumberTextField.getText();
String email = emailTextField.getText();
String notes = notesTextField.getText();
Contact contact = new Contact(name, birthDate, phoneNumber, email, notes);
contacts.add(contact);
}
private void modifyContact() {
String birthDate = birthDateTextField.getText();
String phoneNumber = phoneNumberTextField.getText();
String email = emailTextField.getText();
String notes = notesTextField.getText();
Contact contact = contacts.get(currentContactIndex);
contact.setBirthDate(birthDate);
contact.setPhoneNumber(phoneNumber);
contact.setEmail(email);
contact.setNotes(notes);
}
private void deleteContact() {
if (currentContactIndex >= 0 && currentContactIndex < contacts.size()) {
contacts.remove(currentContactIndex);
currentContactIndex = -1;
}
}
private void loadContactsFromFile() {
try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(DATA_FILE_PATH))) {
contacts = (ArrayList<Contact>) inputStream.readObject();
} catch (FileNotFoundException e) {
// File doesn't exist yet, ignore
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
private void saveContactsToFile() {
try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(DATA_FILE_PATH))) {
outputStream.writeObject(contacts);
} catch (IOException e) {
e.printStackTrace();
}
}
private void updateAddressBookTextArea() {
StringBuilder sb = new StringBuilder();
for (Contact contact : contacts) {
sb.append(contact.getName()).append('
');
}
addressBookTextArea.setText(sb.toString());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PersonalAddressBookGUI();
}
});
}
}
解决文件乱码
文件保存乱码可能是因为文件编码格式不正确导致的。可以尝试在保存文件时指定编码格式,例如:
// 保存文件时指定编码格式
try (Writer writer = new OutputStreamWriter(new FileOutputStream(DATA_FILE_PATH), 'UTF-8')) {
writer.write('要保存的内容');
} catch (IOException e) {
e.printStackTrace();
}
其中,'UTF-8'是指定的编码格式,可以根据需要进行修改。
应用功能
- 添加联系人
- 修改联系人
- 删除联系人
- 保存联系人数据到文件
- 从文件读取联系人数据
- 显示联系人列表
使用说明
- 运行程序。
- 在界面中填写联系人信息。
- 点击'新建'按钮添加新的联系人,或点击'修改'按钮修改当前联系人。
- 点击'保存'按钮将联系人信息保存到文件。
- 点击'删除'按钮删除当前联系人。
- 点击'退出'按钮退出程序。
代码说明
Contact类用于存储联系人信息,包括姓名、出生日期、手机号码、电子邮件和备注。PersonalAddressBookGUI类负责创建和管理应用程序的 GUI,并处理用户操作。loadContactsFromFile()方法用于从文件中读取联系人数据。saveContactsToFile()方法用于将联系人数据保存到文件。updateAddressBookTextArea()方法用于更新联系人列表区域的内容。
注意事项
- 文件保存路径
DATA_FILE_PATH需要根据实际情况进行修改。 - 可以根据需要添加更多的联系人信息字段。
- 可以添加额外的功能,例如搜索联系人、导入导出联系人等。
原文地址: https://www.cveoy.top/t/topic/n95e 著作权归作者所有。请勿转载和采集!