要求:
- 实现
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 而不是 Label private JTextField regPasswordField; // 使用 JTextField 而不是 Label private 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); // 添加新用户名到 JComboBox regUsernameField.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() { @Override public 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, "好友已删除!"); // 更新 JList friendsList.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, "好友已添加!"); // 更新 JList friendsList.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(); } }); } }
效果如下图: