如何用java做一个模拟登录画面

要求:

  1. 实现registerAction方法中的注册逻辑。
  2. 实现login方法中的登录逻辑,确保只有当用户名和密码都正确时才返回true
  3. 实现好友管理功能,包括添加好友、删除好友、查看好友列表。
  4. 确保所有的文件操作(如读取和写入credentials.txtfriends.txt)都能够正确处理异常。
  5. 优化用户界面,提供良好的用户体验。
  6. 确保应用程序的线程安全,特别是在处理Swing组件时。
  7. 完善错误处理,确保应用程序能够优雅地处理异常情况。
  8. 考虑实现记住账号的功能,当用户勾选“记住账号”复选框时,能够保存当前登录的用户名。
  9. 实现注册和登录成功后的反馈提示。
  10. 确保应用程序的所有功能在用户界面上都能够直观地反映出来,并且易于使用。

以下是大致的框架

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();
            }
        });
    }
}

效果如下图:

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值