-项目功能介绍
该登录注册界面具有账号注册和账号登录的基本功能,能够将账号、密码等数据存储进本地文件并读取使用。
-实现各个功能所需要的类
-界面类(UI)
基本的登录注册功能实现需要一个给用户提供输入和反馈结果的可视化界面,即窗口:
-监听器类(Listener)
Java事件监听器是由事件类和监听接口组成,自定义一个事件前,必须提供一个事件的监听接口以及一个事件类。JAVA中监听接口是继承java.util.EventListener的类,事件类继承java.util.EventObject的类。
通俗来说就是:监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
在此处,监听器主要监听按钮对象,分辨登录和注册。
-用户类(User)
顾名思义,用户类是存储用户信息,提供调用用户信息方法的一个类。
-用户服务类(UserService)
提供对用户信息处理的方法,为用户操作提供反馈。
-用户信息保存类(UserStorage)
实现用户数据对文件的读写,即存入新创建的账号和读取文件中的账号并登录
-界面开发
-界面开发部分代码
-需要掌握Java swing界面开发相关知识
开发包:awt/swing
涉及到的类:窗体类(JFrame)、标签类(JLabel)、输入框类(JTextField)、密码输入框类(JPasswordField)、按钮类(JButton)、图标类(ImageIcon)
-开发步骤:
1.创造一个窗体类对象 JFrame
2.设置窗体类对象的属性 标题、尺寸、关闭方式、布局、位置、可视化
JFrame jf = new JFrame();
jf.setTitle("登录注册界面");
jf.setSize(400,480);//设置窗口大小
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭当前窗体
jf.setLayout(new FlowLayout());//流式布局
jf.setLocation(500,500);//在屏幕上的位置
jf.setVisible(true);//设置Frame为可见,默认不可见
3.创建窗体内需要的组件对象 按钮、标签、图片、输入框等
一个ImageIcon对象存放图片,需要一个Label对象存储ImageIcon
String path = "C:\\Users\\Desktop\\图片\\1715342650175.jpg";//图片地址
ImageIcon icon = new ImageIcon(path);//存放图片
JLabel iconJla = new JLabel(icon);//将图片放入标签
jf.add(iconJla);//将iconJla加入窗口
两个JLabel对象,显示“账号”、“密码”两个标签
一个JTextField对象,用于输入账号
一个JPassWord对象,用于输入密码
JLabel nameJla = new JLabel("账号: ");
jf.add(nameJla);
JTextField nameIn = new JTextField(30);
jf.add(nameIn);
JLabel pwdJla = new JLabel("密码: ");
jf.add(pwdJla);
JPasswordField pwdIn = new JPasswordField(30);
jf.add(pwdIn);
两个JButton对象,用于登录和注册
JButton btnLogin = new JButton("登录");
JButton btnRegist = new JButton("注册");
jf.add(btnLogin);
jf.add(btnRegist);
-监听器开发
-监听器开发部分代码
-开发步骤:
ActionListener 动作监听器接口 用于开发监听器按钮的类
1.创建一个新的类 实现这个接口
2.重写接口中的响应方法
3.在方法中添加点击按钮后要执行的代码
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
public class UserListener implements ActionListener{ //提供ActionListener接口
JTextField nameIn2;
JPasswordField pwdIn2;
UserService userService = new UserService();
public void actionPerformed(ActionEvent e) {
String ac = e.getActionCommand();//读取按钮上的文本,放入ac中
String name = nameIn2.getText();
String pwd = pwdIn2.getText();
UserStorage storage = new UserStorage();//UserStorage类实现文件存储功能
if (ac.equals("登录")){ //当按钮文本为“登录”时执行
int loginCode = userService.login(name,pwd);
switch (loginCode){
case 0:
JOptionPane.showConfirmDialog(null,"用户已在线");//JOptionPane.showConfirmDialog可以实现弹窗提示
break;
case 1:
JOptionPane.showConfirmDialog(null,"登录成功");
storage.changeUsers(name); //此处实现用户在线状态的变化
break;
case 2:
JOptionPane.showConfirmDialog(null,"密码错误");
break;
case 3:
JOptionPane.showConfirmDialog(null,"用户未注册");
break;
}
} else if (ac.equals("注册")) { //当按钮文本为“注册”时执行
int regCode = userService.register(name,pwd);
switch (regCode){
case 0:
JOptionPane.showConfirmDialog(null,"该用户已存在");
break;
case 1:
JOptionPane.showConfirmDialog(null,"账号为长度大于5,小于12的字母或数字");
break;
case 2:
JOptionPane.showConfirmDialog(null,"密码为长度大于6,小于12的字母或数字");
break;
case 3:
JOptionPane.showConfirmDialog(null,"注册成功,请前往登录");
List<User> data = new ArrayList<User>();
data.add(new User(name, pwd, false));
storage.saveUsers(data); //此处实现新账户存入文本文件
break;
}
}
}
}
4.将这个类实例化一个对象与需要监听的按钮绑定
//这段代码写在 UI 中
UserListener u1 = new UserListener();
btnLogin.addActionListener(u1);
btnRegist.addActionListener(u1);
-用户类开发
-用户类开发部分代码
-开发步骤
1.创建一个新的类
2.创建接收和输出用户数据的方法
3.在方法中添加各自功能实现的代码
public class User {
private String name; //账号
private String pwd; //密码
private boolean isLogin; //登录状态
public User(String name, String pwd, boolean isLogin) { //接收用户信息
this.name = name;
this.pwd = pwd;
this.isLogin = isLogin;
}
public int login(String pwdIn) { //此处为UserService访问User的方法,用于判断密码是否正确
if (pwd.equals(pwdIn)) {
if (isLogin) {
return 0; //返回值为状态码
}
isLogin = true;
return 1;
}
return 2;
}
public String getName(){ //外部访问name
return name;
}
public void setName(String name){
this.name = name;
}
public String getPwd(){ //外部访问pwd
return pwd;
}
public void setPwd(String pwd){
this.pwd = pwd;
}
public boolean isIsLogin(){ //外部访问isLogin
return isLogin;
}
public void setIsLogin(boolean isLogin){
this.isLogin = isLogin;
}
}
-用户服务类开发
-用户服务类开发部分代码
-开发步骤
1.创建一个新的类
2.创建处理用户信息数据的方法
3.在方法中添加各自功能实现的代码
public class UserService {
UserStorage storage = new UserStorage();
List<User> userList = storage.loadUsers(); //调用文件读取功能,读取已注册用户的数据
public int login(String name, String pwd) {
for(int i = 0; i < userList.size(); i++){ //用for循环判断用户输入的账号是否存在
User user = userList.get(i);
if (user.getName().equals(name)){ //账号存在就判断密码是否正确
return user.login(pwd); //需要调用private数据,用User内部的方法
}
}
return 3; //返回状态码
}
public int register(String name, String pwd){
for(int i = 0; i < userList.size(); i++){ //用for循环判断用户输入的账号是否存在
User user = userList.get(i);
if (user.getName().equals(name)){
return 0;
}
}
if(name.length() < 5 || name.length() >12){ //判断账号长度是否规范
return 1;
} else if (pwd.length() < 6 || pwd.length() > 12) { //判断密码长度是否规范
return 2;
}
userList.add(new User(name, pwd, false));
return 3;
}
}
-用户信息保存类开发
-用户信息保存类开发部分代码
-开发步骤
1.确定用户数据存储的格式
此处采用将用户信息以键值对的形式存储在文本文件中,每个用户的数据占一行,键和值之间用冒号分隔,不同的键之间用逗号分隔。
2.创建一个新的类
3.创建读取、存入和改变用户信息数据的方法
4.在方法中添加各自功能实现的代码
public class UserStorage {
private static final String DATA_FILE = "users.txt"; //存储数据的文本文件名
private String Temp = "temp.txt"; //执行修改数据时的临时文件名
private String userToText(User user){ //按规定格式存入数据
return user.getName() + ":" + user.getPwd() + ":" + user.isIsLogin();
}
private User textToUser(String text){ //按规定格式读取数据
String[] parts = text.split(":"); //将数据以“:”为分隔,分成多个字符串
if (parts.length != 3){ //判断数据是否合规
return null;
}
return new User(parts[0], parts[1], Boolean.parseBoolean(parts[2]));//创建一个临时用户来进行操作
}
public void saveUsers(List<User> users){
try(BufferedWriter writer = new BufferedWriter(new FileWriter(DATA_FILE,true))){ //逐行写入
for(User user : users){ //增强for循环
writer.write(userToText(user));
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public List<User> loadUsers(){
List<User> users = new ArrayList<>();
try(BufferedReader reader = new BufferedReader(new FileReader(DATA_FILE))){ //逐行读取
String line;
while ((line = reader.readLine()) != null){
users.add(textToUser(line));
}
} catch (IOException e) {
e.printStackTrace();
}
return users;
}
public void changeUsers(String name){
Path originalFile = Paths.get(DATA_FILE);
Path tempFile = Paths.get(Temp); //获取两个文件的路径
try(BufferedReader load = new BufferedReader(new FileReader(DATA_FILE));
BufferedWriter change = new BufferedWriter(new FileWriter(Temp))){ //通过逐行读取和存入修改指定账号的登录状态
String temp ;
int lineNumber = 0;
while ((temp = load.readLine()) != null){
String[] p = temp.split(":");
lineNumber++;
if (name.equals(p[0])){ //当读取到指定账号时
p[2] = "True"; //改变登录状态
temp = p[0] + ":" + p[1] + ":" + p[2];
}
change.write(temp);
change.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
Files.move(tempFile, originalFile, StandardCopyOption.REPLACE_EXISTING);//用修改后文本文件覆盖原文件,并删除临时文件
} catch (IOException e){
e.printStackTrace();
}
}
}
-测试
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args){
List<User> users = new ArrayList<>();
UserStorage storage = new UserStorage();
List<User> loadedUsers = storage.loadUsers();
storage.saveUsers(users);
UI ui = new UI();
ui.showLoginUI();
for (User user : loadedUsers){ //输出所有账号数据
System.out.println("Name:" + user.getName() + ",Password:" + user.getPwd() + ", Is Login: " + user.isIsLogin());//
}
}
}
-注册
-登录
此项目仅为就基础功能,后续可继续完善。