如何用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 而不是 Labelprivate JTextField regPasswordField; // 使用 JTextField 而不是 Labelprivate 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); // 添加新用户名到 JComboBoxregUsernameField.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() {@Overridepublic 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, "好友已删除!");// 更新 JListfriendsList.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, "好友已添加!");// 更新 JListfriendsList.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.mzph.cn/pingmian/14348.shtml

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

相关文章

Pytorch深度学习实践笔记4

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

信息化项目交付验收流程管理办法

项目交付验收流程制度 管理办法 (执行版) (文件编号: ) 编制: 审核: 批准: 版本: 生效日期: 管理办法概述 制定目的为了保证公司在建项目交付验收工作事项的顺利开展,保证交付验收进度及…

创新力作 焕新首发丨捷顺科技·捷曜系列智慧停车新品全新上市

2024捷顺科技智慧停车全家族新品全面上市 全新外观、全新特性、全新体验 新控制机、新道闸、新超眸相机... 每款新品都有哪些功能亮点 带您一探究竟

解决vue3 vite打包报Root file specified for compilation问题

解决方法&#xff1a; 修改package.json打包命令 把 "build": "vue-tsc --noEmit && vite build" 修改为 "build": "vite build" 就可以了 另外关于allowJs这个问题&#xff0c;在tsconfig.json文件中配置"allowJs&qu…

C++入门:从C语言到C++的过渡(1)

目录 1.什么是C 2.C的标准库 3.命名空间 3.1为什么要存在命名空间 3.2命名空间的定义 3.3命名空间的使用 3.3.1域作用限定符 3.3.2using关键字引入某个成员 3.3.3using关键字引入命名空间名称 3.4命名空间的嵌套 3.5命名空间的合并 4.C中的输入与输出 1.什么是C C&am…

mysql binlog统一恢复误删数据库、表、数据(没有任何备份)

先将mysql文件夹中的my.ini进行设置 在 [mysqld]下边加上 # mysql-bin 是日志的基本名或前缀名&#xff0c;最后生成的日志文件是mysql-bin.000001类似&#xff0c;重启mysql数字会递增 log_binmysql-bin #binlog格式&#xff0c;statement&#xff0c;row&#xff0c;mixed可…

Reactor设计模式

Reactor设计模式 Reactor模式称为反应器模式或应答者模式&#xff0c;是基于事件驱动的设计模式&#xff0c;拥有一个或多个并发输入源&#xff0c;有一个服务处理器和多个请求处理器&#xff0c;服务处理器会同步的将输入的请求事件以多路复用的方式分发给相应的请求处理器。…

前端自动将 HTTP 请求升级为 HTTPS 请求

前端将HTTP请求升级为HTTPS请求有两种方式&#xff1a; 一、index.html 中插入meta 直接在首页 index.html 的 head 中加入一条 meta 即可&#xff0c;如下所示&#xff1a; <meta http-equiv"Content-Security-Policy" content"upgrade-insecure-requests&…

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

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

AI日报:讯飞星火Lite API永久免费;李开复称大模型疯狂降价是双输;AI特效末日滤镜抖音爆火;AI音乐Suno 融资1.25亿美元

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 1、科大讯飞…

can设备调试 - linux driver

这篇文章主要介绍can设备的调试相关信息&#xff0c;不具体介绍驱动的实现。 如果驱动写完&#xff0c;对can设备进行验证&#xff0c;可能会出现很多不可预见的问题。下面说说验证步骤 验证can设备可以使用工具can-utils。这个工具包中会有cansend candump等程序。可以直接通…

系统架构师考试(十)

SaaS为在线客服 PaaS为二次开发&#xff0c;比如低代码平台 IaaS 硬件开发 B 是基础设施作为服务 软件架构的概念 架构风格 数据流风格 网络报文是在计算机网络中通过网络传输的数据单元&#xff0c;它是网络通信的基本单位。网络报文包含了发送方和接收方之间传输的数据&…

『网络攻防和AI安全之家』星球正式运营及CSDN安全知识汇总,欢迎广大博友加入

“今天是Eastmount的安全星球 —— 『网络攻防和AI安全之家』正式创建和运营的日子&#xff0c;该星球目前主营业务为 安全零基础答疑、安全技术分享、AI安全技术分享、AI安全论文交流、威胁情报每日推送、网络攻防技术总结、系统安全技术实战、面试求职、安全考研考博、简历修…

计算机操作系统核心组件

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天给大家讲讲操作系统。 操作系统核心组件 用户借助于一个或多个应用程序与操作系统进行交互&#xff0c;常常是通过一个称为shell的特殊应用程序进行的&#xff0c;shell也叫作命令解释器。105今天的大多…

Postgresql源码(130)ExecInterpExpr转换为IR的流程

相关 《Postgresql源码&#xff08;127&#xff09;投影ExecProject的表达式执行分析》 《Postgresql源码&#xff08;128&#xff09;深入分析JIT中的函数内联llvm_inline》 《Postgresql源码&#xff08;129&#xff09;JIT函数中如何使用PG的类型llvmjit_types》 表达式计算…

Java设计模式 _行为型模式_迭代器模式

一、迭代器模式 1、迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于顺序访问集合对象的元素&#xff0c;不需要关心集合对象的底层表示。如&#xff1a;java中的Iterator接口就是这个工作原理。 2、实现思路 &#xff0…

tomcat jdbc连接池的默认配置配置方案

MySQL 5.0 以后针对超长时间数据库连接做了一个处理&#xff0c;即一个数据库连接在无任何操作情况下过了 8 个小时后(MySQL 服务器默认的超时时间是 8 小时)&#xff0c;MySQL 会自动把这个连接关闭。在数据库连接池中的 connections 如果空闲超过 8 小时&#xff0c;MySQL 将…

国家自然博物馆“云端自然”线上虚拟展厅是如何搭建的?

国家级综合性自然博物馆国家自然博物馆&#xff0c;联手积木易搭打造“云端自然”线上虚拟展览&#xff0c;形成一个集参观游览、科普教育为一体的线上虚拟数字博物馆平台&#xff0c;让数千以至数万年的古生物&#xff0c;栩栩如生地呈现在我们面前。 通过数字化的展示手段&am…

在做题中学习(61):连续数组

525. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;前缀和 哈希表 转化&#xff1a;将 0 ——> -1 转变为&#xff1a;找到和为0的最长子数组 细节&#xff1a; 1.哈希表存什么 前缀和 &#xff0c; 长度 2.什么时候存入哈希表 先处理前一个&…