要求:
- 实现
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();
}
});
}
}
效果如下图:



















