这是一个使用 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'是指定的编码格式,可以根据需要进行修改。

应用功能

  • 添加联系人
  • 修改联系人
  • 删除联系人
  • 保存联系人数据到文件
  • 从文件读取联系人数据
  • 显示联系人列表

使用说明

  1. 运行程序。
  2. 在界面中填写联系人信息。
  3. 点击'新建'按钮添加新的联系人,或点击'修改'按钮修改当前联系人。
  4. 点击'保存'按钮将联系人信息保存到文件。
  5. 点击'删除'按钮删除当前联系人。
  6. 点击'退出'按钮退出程序。

代码说明

  • Contact 类用于存储联系人信息,包括姓名、出生日期、手机号码、电子邮件和备注。
  • PersonalAddressBookGUI 类负责创建和管理应用程序的 GUI,并处理用户操作。
  • loadContactsFromFile() 方法用于从文件中读取联系人数据。
  • saveContactsToFile() 方法用于将联系人数据保存到文件。
  • updateAddressBookTextArea() 方法用于更新联系人列表区域的内容。

注意事项

  • 文件保存路径 DATA_FILE_PATH 需要根据实际情况进行修改。
  • 可以根据需要添加更多的联系人信息字段。
  • 可以添加额外的功能,例如搜索联系人、导入导出联系人等。
Java 个人通讯录 GUI 应用:管理您的联系人信息

原文地址: https://www.cveoy.top/t/topic/n95e 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录