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

效果如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637898.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins安装 :AWS EC2 Linux

1 JDK11 install # 用的yum安装 # 压缩包安装&#xff0c;下载的jdk-11.0.22_linux-x64_bin.tar.gz在EC2解压&#xff0c;配置环境变量&#xff0c;运行jenkins的时候会报错$ yum -y list java-11* Available Packages java-11-amazon-corretto-devel.x86_64 …

NLP(16)--生成式任务

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 输入输出均为不定长序列&#xff08;seq2seq&#xff09;自回归语言模型&#xff1a; x 为 str[start : end ]; y为 [start1 : end 1] 同时训练多个字&#xff0c;逐字计算交叉熵 encode-decode结构&#xff1a; Encoder将输…

设计模式——概述

1.设计模式定义 ​ 设计模式是软件设计中常见问题的典型解决方案,可用于解决代码中反复出现的设计问题。设计模式的出现可以让我们站在前人的肩膀上&#xff0c;通过一些成熟的设计方案来指导新项目的开发和设计&#xff0c;以便于我们开发出具有更好的灵活性和可扩展性&#…

如何在window中快速建立多个文件夹?

时隔多年&#xff0c;再次开始撰写文章&#xff0c;但是这次却是以设计师的身份 1. 几个基础快捷键先记一下&#xff0c;要不更高级的玩儿不转&#xff08;1&#xff09;快速打开资源管理器&#xff08;2&#xff09;快速建立新文件夹&#xff08;3&#xff09;快速修改文件文件…

【openlayers系统学习】1.1渲染GeoJSON,添加link交互

一、渲染GeoJSON 在进入编辑之前&#xff0c;我们将看一下使用矢量源和图层进行基本要素渲染。Workshop在 data​ 目录中包含一个 countries.json​ GeoJSON文件。我们首先加载该数据并将其渲染在地图上。 首先&#xff0c;编辑 index.html​ 以便向地图添加深色背景&#xf…

树洞陪聊系统源码/陪聊/陪玩/树洞/陪陪/公众号开发/源码交付/树洞系统源码

独立版本源码交付&#xff0c;自研UI和前后端代码 平台自带店员&#xff0c;无需自主招募&#xff0c;搭建直接运营 支持三方登录&#xff0c;官方支付、虎皮椒、易支付/码支付 支持首单体验、盲盒订单、指定下单等多个模式 支持钱包预充值、店员收藏、订单评价等功能 支持…

网页加载时,大图片文件如何分片加载,有示例代码。

浏览网页时候&#xff0c;碰到大图片半天加载不出来&#xff0c;急死人&#xff0c;本问分享一种分片加载的方式&#xff0c;其实还有其他方式&#xff0c;比如先模糊后清晰等。 一、为什么要分片加载 大图片文件可以通过分片加载来提高加载性能和用户体验。分片加载的基本思…

智能禁区监控:计算机视觉在人员禁区闯入检测中的应用

基于视觉分析的人员禁区闯入行为检测算法主要依赖于计算机视觉技术和深度学习算法。这些技术结合高性能的摄像头和图像处理硬件&#xff0c;实现了对监控区域内人员行为的自动识别和分析。具体来说&#xff0c;这种检测算法利用摄像头捕捉的视频数据&#xff0c;通过深度学习模…

科技前沿:IDEA插件Translation v3.6 带来革命性更新,翻译和发音更智能!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

leetcode124 二叉树中的最大路径和-dp

题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…

50.WEB渗透测试-信息收集-CDN识别绕过(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;49.WEB渗透测试-信息收集-CDN识别绕过&#xff08;2&#xff09; 关于cdn的识别方法内容…

基于SpringBoot的社区医院管理系统

基于SpringBootVue的社区医院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 医生预约 管理员界面 医生界面 摘要 基于Spring Boot的社区医院管理系…

linux命令日常使用思考

linux命令日常使用思考 复制的相关问题scp和cp的区别root192.168.5.229-r的理解 更新版本的相关问题svn info 根目录和家目录的区别根目录家目录 复制的相关问题 scp和cp的区别 安全性&#xff1a;SCP 是基于 SSH 的加密传输协议&#xff0c;可以保证数据在传输过程中的安全性…

揭秘网红老阳的选品师项目:从选品到赚钱的全方位解析

在快节奏的互联网时代&#xff0c;网红隋总以其独特的洞察力和前瞻性&#xff0c;为我们揭示了人力RPO(招聘流程外包)项目背后的变革与机遇。这次&#xff0c;我们不再单纯地从市场或企业的角度来探讨这个项目&#xff0c;而是从更宏观的视角&#xff0c;看看它如何推动了人力资…

Python 调整PDF文件的页面大小

在处理PDF文件时&#xff0c;我们可能会遇到这样的情况&#xff1a;原始PDF文档不符合我们的阅读习惯&#xff0c;或者需要适配不同显示设备等。这时&#xff0c;我们就需要及时调整PDF文档中的页面尺寸&#xff0c;以满足不同应用场景的需求。 利用Python语言的高效性和灵活性…

关于redis设置的密码不生效问题

今天申请了阿里云使用3个月的服务器&#xff0c;于是想在服务器上部署一下自己的项目&#xff0c;但是吸取了上次的教训&#xff0c;再也不敢随便开放redis的端口号了&#xff0c;就算要开放redis的端口&#xff0c;也要设置密码&#xff0c;保证不会被挖矿病毒通过redis入侵服…

自用升级centos7.2的默认Python 2.7.5为python3.8

wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tgztar zxvf Python-3.8.8.tgz 进入刚刚解压后的目录 ./configure --prefix/data/soft/python3按照上面截图所属&#xff0c;需要安装gcc 安装报错需要安装 sudo yum install zlib1g-dev make -j4 make install -…

VBA语言専攻每周通知20240524

通知20240524 各位学员∶本周MF系列VBA技术资料增加611-615讲&#xff0c;T3学员看到通知后请免费领取,领取时间5月24日晚上18:00-5月26日晚上18:00。本次增加内容&#xff1a; MF611:用InputBox录入日期 MF612:信息提示10秒后关自动关闭 MF613:只是信息提示10秒 MF614:显…

VUE2 tab切换导航 展示页面内容(父级子级独立)

VUE2 tab切换导航 展示页面内容 父级子级独立 图片示例代码 图片示例 代码 <template><div class"center"><!-- 一级导航 --><div class"menu"><div class"menu_list"><div v-for"item of List" :k…

新定义RD8T36P48使用USCI0的TWI功能点亮OLED

时间不多&#xff0c;因此先只给出工程&#xff0c;等有时间再添加详细说明 现象 这是从之前的一个51单片机的程序移植过来的&#xff0c;主要修改了IIC启动和停止&#xff0c;以及数据发送的代码&#xff0c;我现在还不是很满意的一点是发送过程中要等待上一个字节发送完才能…