要求:
- 实现
registerAction
方法中的注册逻辑。 - 实现
login
方法中的登录逻辑,确保只有当用户名和密码都正确时才返回true
。 - 实现好友管理功能,包括添加好友、删除好友、查看好友列表。
- 确保所有的文件操作(如读取和写入
credentials.txt
和friends.txt
)都能够正确处理异常。 - 优化用户界面,提供良好的用户体验。
- 确保应用程序的线程安全,特别是在处理Swing组件时。
- 完善错误处理,确保应用程序能够优雅地处理异常情况。
- 考虑实现记住账号的功能,当用户勾选“记住账号”复选框时,能够保存当前登录的用户名。
- 实现注册和登录成功后的反馈提示。
- 确保应用程序的所有功能在用户界面上都能够直观地反映出来,并且易于使用。
以下是大致的框架
package test10;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.util.*;
import java.util.List;
/**
* 模拟QQ登录界面的Java Swing应用程序。
*/
public class QQLoginMultiUser {
// 应用程序的GUI组件
private JFrame frame; // 主窗口
private JComboBox<String> usernameComboBox; // 用户名下拉列表
private JPasswordField passwordField; // 密码输入框
private JCheckBox rememberCheckbox; // 记住账号复选框
private static final String CREDENTIALS_FILE = "credentials.txt"; // 存储凭证的文件
private final Map<String, String> credentials = new HashMap<>(); // 存储用户名和密码的映射
private final List<String> usernameList = new ArrayList<>(); // 存储用户名的列表
private final Map<String, List<String>> friendsMap = new HashMap<>(); // 存储用户和好友的映射
private String loggedInUsername; // 已登录的用户名
private JFrame friendsFrame; // 显示好友列表的窗口
private JList<String> friendsList; // 显示好友的列表
private JTextField regUsernameField; // 注册界面的用户名输入框
private JTextField regPasswordField; // 注册界面的密码输入框
private int NORTH; // BorderLayout的北方向常量
/**
* 构造函数,初始化GUI组件和加载数据。
*/
public QQLoginMultiUser() {
initialize();
loadSavedCredentials();
loadFriends();
}
/**
* 初始化GUI组件。
*/
private void initialize() {
// 初始化窗口和组件,设置布局、事件监听器等
// ...
}
/**
* 显示注册表单。
*/
private void showRegisterForm() {
// 创建注册窗口和组件,设置布局和事件监听器
// ...
}
/**
* 注册新用户。
*
* @param username 用户名
* @param password 密码
* @return 注册成功与否
*/
private boolean registerAction(String username, String password) {
// 实现注册逻辑
// ...
return true;
}
/**
* 从文件加载已保存的凭证。
*/
private void loadSavedCredentials() {
// 从文件读取用户名和密码,更新credentials和usernameList
// ...
}
/**
* 从文件加载好友列表。
*/
private void loadFriends() {
// 从文件读取好友信息,更新friendsMap
// ...
}
/**
* 保存好友列表到文件。
*/
private void saveFriends() {
// 将friendsMap中的好友信息写入文件
// ...
}
/**
* 添加好友。
*
* @param friend 要添加的好友用户名
*/
private void addFriend(String friend) {
// 将指定的好友添加到当前登录用户的好友列表中,并保存
// ...
}
/**
* 显示指定用户的好友列表。
*
* @param username 要显示好友列表的用户名
*/
private void showFriendsList(String username) {
// 创建好友列表窗口,填充好友数据,并设置事件监听器
// ...
}
/**
* 删除好友。
*
* @param friend 要删除的好友用户名
*/
private void removeFriend(String friend) {
// 从当前登录用户的好友列表中删除指定的好友,并保存
// ...
}
/**
* 提示用户输入并添加好友。
*/
private void addFriendPrompt() {
// 弹出对话框让用户输入好友用户名,并添加到好友列表
// ...
}
/**
* 查看和显示好友列表。
*
* @param friendsFrame 好友列表窗口
* @param friends 好友列表数据
*/
private void viewFriends(JFrame friendsFrame, List<String> friends) {
// 弹出对话框显示当前用户的好友列表
// ...
}
/**
* 用户登录操作。
*/
private void loginAction() {
// 获取用户名和密码,执行登录逻辑,根据结果弹出相应的对话框
// ...
}
/**
* 检查用户名和密码是否正确。
*
* @param username 用户名
* @param password 密码
* @return 是否登录成功
*/
private boolean login(String username, String password) {
// 检查credentials中是否存在对应的用户名和密码
// ...
return false;
}
// 省略其他方法...
/**
* 主方法,启动应用程序。
*
* @param args 命令行参数
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new QQLoginMultiUser());
}
}
根据框架我们就可以给出具体代码了,可能不是很好,望各位大佬指点
package test10;import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.*; import java.util.*; import java.util.List;public class QQLoginMultiUser {private JFrame frame;private JComboBox<String> usernameComboBox;private JPasswordField passwordField;private JCheckBox rememberCheckbox;private static final String CREDENTIALS_FILE = "credentials.txt";private final Map<String, String> credentials = new HashMap<>();private final List<String> usernameList = new ArrayList<>();private final Map<String, List<String>> friendsMap = new HashMap<>();private String loggedInUsername;private JFrame friendsFrame;private JList<String> friendsList;private JTextField regUsernameField; // 使用 JTextField 而不是 Labelprivate JTextField regPasswordField; // 使用 JTextField 而不是 Labelprivate int NORTH;public QQLoginMultiUser() {initialize();loadSavedCredentials();loadFriends();}private void initialize() {frame = new JFrame("模拟登录");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(400, 300);frame.setLayout(new GridBagLayout());// 用户名组件JLabel lblUsername = new JLabel("用户名:");GridBagConstraints gbc = new GridBagConstraints();gbc.gridx = 0;gbc.gridy = 0;gbc.anchor = GridBagConstraints.EAST;frame.add(lblUsername, gbc);usernameComboBox = new JComboBox<>();usernameComboBox.setEditable(true);gbc = new GridBagConstraints();gbc.gridx = 1;gbc.gridy = 0;gbc.gridwidth = 2;gbc.fill = GridBagConstraints.HORIZONTAL;gbc.weightx = 1;frame.add(usernameComboBox, gbc);// 密码组件JLabel lblPassword = new JLabel("密码:");gbc = new GridBagConstraints();gbc.gridx = 0;gbc.gridy = 1;gbc.anchor = GridBagConstraints.EAST;frame.add(lblPassword, gbc);passwordField = new JPasswordField();gbc = new GridBagConstraints();gbc.gridx = 1;gbc.gridy = 1;gbc.fill = GridBagConstraints.HORIZONTAL;gbc.weightx = 1;frame.add(passwordField, gbc);// 登录按钮JButton btnLogin = new JButton("登录");btnLogin.addActionListener(e -> loginAction());gbc = new GridBagConstraints();gbc.gridx = 1;gbc.gridy = 2;gbc.anchor = GridBagConstraints.CENTER;frame.add(btnLogin, gbc);// 注册按钮JButton btnRegister = new JButton("注册");btnRegister.addActionListener(e -> showRegisterForm());gbc = new GridBagConstraints();gbc.gridx = 2;gbc.gridy = 2;gbc.anchor = GridBagConstraints.CENTER;frame.add(btnRegister, gbc);// 记住账号复选框rememberCheckbox = new JCheckBox("记住账号");gbc = new GridBagConstraints();gbc.gridx = 0;gbc.gridy = 3;gbc.anchor = GridBagConstraints.WEST;frame.add(rememberCheckbox, gbc);frame.setVisible(true);}private void showRegisterForm() {JFrame registerFrame = new JFrame("用户注册");registerFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);registerFrame.setSize(300, 150);registerFrame.setLayout(new FlowLayout());JTextField regUsernameField = new JTextField();JTextField regPasswordField = new JTextField();JButton regButton = new JButton("注册");regButton.addActionListener(e -> registerAction(regUsernameField.getText(), regPasswordField.getText()));registerFrame.add(regUsernameField);registerFrame.add(regPasswordField);registerFrame.add(regButton);registerFrame.setVisible(true);}private boolean registerAction(String username, String password) {// 这里应实现注册逻辑// 假设注册成功JOptionPane.showMessageDialog(frame, "注册成功!");usernameComboBox.addItem(username); // 添加新用户名到 JComboBoxregUsernameField.setText(""); // 清空注册界面的用户名输入框regPasswordField.setText(""); // 清空注册界面的密码输入框return true; // 返回注册结果}private void loadSavedCredentials() {credentials.clear();usernameList.clear();try (BufferedReader reader = new BufferedReader(new FileReader(CREDENTIALS_FILE))) {String line;while ((line = reader.readLine()) != null) {String[] cred = line.split(":");if (cred.length == 2) {credentials.put(cred[0], cred[1]);usernameList.add(cred[0]);usernameComboBox.addItem(cred[0]);}}} catch (IOException e) {e.printStackTrace();}}private void loadFriends() {friendsMap.clear();try (BufferedReader reader = new BufferedReader(new FileReader("friends.txt"))) {String line;while ((line = reader.readLine()) != null) {String[] parts = line.split(":");if (parts.length == 2) {String user = parts[0].trim();String friend = parts[1].trim();if (!friendsMap.containsKey(user)) {friendsMap.put(user, new ArrayList<>());}friendsMap.get(user).add(friend);}}} catch (IOException e) {e.printStackTrace();}}private void saveFriends() {try (BufferedWriter writer = new BufferedWriter(new FileWriter("friends.txt", false))) {for (Map.Entry<String, List<String>> entry : friendsMap.entrySet()) {for (String friend : entry.getValue()) {writer.write(entry.getKey() + ":" + friend);writer.newLine();}}} catch (IOException e) {e.printStackTrace();}}private void addFriend(String friend) {if (loggedInUsername != null && !friend.isEmpty() && !friend.equals(loggedInUsername)) {if (!friendsMap.containsKey(loggedInUsername)) {friendsMap.put(loggedInUsername, new ArrayList<>());}friendsMap.get(loggedInUsername).add(friend);saveFriends(); // 更新好友列表并保存}}private void showFriendsList(String username) {friendsFrame = new JFrame("好友列表 - " + username);friendsFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);friendsFrame.setSize(300, 200);friendsFrame.setLayout(new BorderLayout());// 创建一个 JList 来显示好友List<String> friends = friendsMap.getOrDefault(username, Collections.emptyList());friendsList = new JList<>(friends.toArray(new String[0]));JScrollPane scrollPane = new JScrollPane(friendsList);// 创建添加好友的按钮JButton addFriendButton = new JButton("添加好友");addFriendButton.addActionListener(e -> addFriendPrompt());friendsFrame.add(addFriendButton, NORTH);friendsFrame.add(scrollPane, BorderLayout.CENTER);// 创建查看好友的按钮JButton viewFriendsButton = new JButton("查看好友");viewFriendsButton.addActionListener(e -> viewFriends(friendsFrame, friends));friendsFrame.add(addFriendButton, BorderLayout.CENTER);friendsFrame.add(viewFriendsButton, BorderLayout.SOUTH);friendsFrame.add(scrollPane, BorderLayout.EAST);// 创建删除好友的功能friendsList.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {if (SwingUtilities.isRightMouseButton(e)) {int index = friendsList.locationToIndex(e.getPoint());String friend = (String) friendsList.getSelectedValue();removeFriend(friend); // 调用删除好友的方法}}});((JComponent) scrollPane).setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));scrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(20, 0));friendsFrame.setVisible(true);}private void removeFriend(String friend) {if (loggedInUsername != null && friendsMap.containsKey(loggedInUsername)) {List<String> friends = friendsMap.get(loggedInUsername);if (friends != null && friends.contains(friend)) {friends.remove(friend);saveFriends(); // 更新好友列表并保存JOptionPane.showMessageDialog(friendsFrame, "好友已删除!");// 更新 JListfriendsList.setListData(friends.toArray(new String[0]));} else {JOptionPane.showMessageDialog(friendsFrame, "好友未找到,无法删除!");}}}private void addFriendPrompt() {String friendToAdd = JOptionPane.showInputDialog(friendsFrame, "请输入好友的用户名:", "添加好友", JOptionPane.QUESTION_MESSAGE);if (friendToAdd != null && !friendToAdd.trim().isEmpty()) {addFriend(friendToAdd);JOptionPane.showMessageDialog(friendsFrame, "好友已添加!");// 更新 JListfriendsList.setListData(friendsMap.getOrDefault(loggedInUsername, Collections.emptyList()).toArray(new String[0]));}}private void viewFriends(JFrame friendsFrame, List<String> friends) {StringBuilder sb = new StringBuilder("好友列表:\n");for (String friend : friends) {sb.append(friend).append("\n");}JOptionPane.showMessageDialog(this.friendsFrame, sb.toString(), "好友列表", JOptionPane.INFORMATION_MESSAGE);}private void loginAction() {String username = (String) usernameComboBox.getEditor().getItem();String password = new String(passwordField.getPassword());if (login(username, password)) {JOptionPane.showMessageDialog(frame, "登录成功!");loggedInUsername = username; // 记录已登录的用户名showFriendsList(loggedInUsername);frame.dispose(); // 关闭登录窗口} else {JOptionPane.showMessageDialog(frame, "用户名或密码错误!");}}private boolean login(String username, String password) {return credentials.containsKey(username) && credentials.get(username).equals(password);}// 省略 register, saveCredentials 等其他方法...public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {public void run() {new QQLoginMultiUser();}});} }
效果如下图: