java--swing界面实现注册登录(用文本文件存储数据)

本文是一篇针对Java Swing图形界面和文件IO流的初学者教程,作者通过创建登录和注册界面,详细展示了如何使用Swing构建桌面应用。代码中包含了布局管理、事件监听、文件读写等核心概念,同时也涉及了中文字符检查和用户信息验证。源码已上传至码云,供读者实践学习。
摘要由CSDN通过智能技术生成

效果如下图

在这里插入图片描述
在这里插入图片描述

虽然使用java很久了,但是对于swing的图形编程还是个小白,还有对于文件io流的操作也几乎是没有接触过,所以今天写这篇文章来学习一下。用swing来写桌面软件真的好麻烦,主要是我没有安装可视化的插件,所以在设置布局的时候很烦。

来看一下代码吧!

1.首先是软件的入口 Main类

import java.io.IOException;

public class Main {
	public static void main(String[] args) throws IOException {
		new Login();//首先进入登录界面
		
	}

}

2.Login类

import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.*;

@SuppressWarnings("serial")
public class Login extends JFrame implements ActionListener{

	JButton jb1, jb2, jb3;  //按钮
	JPanel jp1,jp2,jp3, jp4;		//面板
	JTextField jtf;   //文本框
	JLabel jlb1, jlb2, jlb3; //标签
	JPasswordField jpf; //密码框
	
	
	public  Login() {
		
		// TODO Auto-generated constructor stub
		jb1 = new JButton("登录");
		jb2 = new JButton("注册");
		//设置按钮监听
		jb1.addActionListener(this);
		jb2.addActionListener(this);
		
		jp1 = new JPanel();  //创建面板
		jp2 = new JPanel();
		jp3 = new JPanel();
		jp4 = new JPanel();
		
		
		jlb1 = new JLabel("用户名");  //添加标签
		jlb2 = new JLabel("  密  码");
		
		jtf = new JTextField(10);	//创建文本框和密码框
		jpf = new JPasswordField(10);
		
		//加入面板中
		jp1.add(jlb1);
		jp1.add(jtf);
		
		jp2.add(jlb2);
		jp2.add(jpf);
		
		jp3.add(jb1);
		jp3.add(jb2); 
		
		
		//将JPane加入JFrame中  
        this.add(jp1);  
        this.add(jp2);  
        this.add(jp3);  
     

             
       //设置布局
        this.setTitle("用户登录");
        this.setLayout(new GridLayout(3,1));
        this.setSize(300, 200);   //设置窗体大小
        this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)  
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);  //设置仅关闭当前窗口
        
        this.setVisible(true);  //设置可见
        this.setResizable(false);	//设置不可拉伸大小
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getActionCommand()=="登录")
		{
			try {
				login();
			} catch (HeadlessException | IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		else if(e.getActionCommand()=="注册")  
        {  
           //  clear();  
			new Register();
			dispose();  //使窗口消失
        }
	}
	//清空账号和密码框
	private void clear() {
		// TODO Auto-generated method stub
		jtf.setText("");    //设置为空
        jpf.setText("");  
		
	}

	//验证登录信息,并做处理
	@SuppressWarnings("deprecation")
	public  void login() throws HeadlessException, IOException
	{
		//判断账户名和密码是否包含中文
		if (new Check().checkcountname(jtf.getText())||new Check().checkcountname(jpf.getText()))
		{
			JOptionPane.showMessageDialog(null, "用户名或密码存在中文,不合法!","消息提示",JOptionPane.WARNING_MESSAGE);
		}
		else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty())
		{
			JOptionPane.showMessageDialog(null, "账号密码为空,请输入!","消息提示",JOptionPane.WARNING_MESSAGE);
		}
		else if (jtf.getText().isEmpty()) 
		{
			JOptionPane.showMessageDialog(null, "账号为空,请输入!","消息提示",JOptionPane.WARNING_MESSAGE);
		}
		else if (jpf.getText().isEmpty()) 
		{
			JOptionPane.showMessageDialog(null, "密码为空,请输入!","消息提示",JOptionPane.WARNING_MESSAGE);
			
		}
		else if (new Check().check1(jtf.getText(),jpf.getText()))
		{
			JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE);
			dispose();  //使文原窗体消失
		}
		else
		{
			JOptionPane.showMessageDialog(null, "账号密码错误请重新输入!","消息提示",JOptionPane.ERROR_MESSAGE);
			clear();  //调用清除函数
		}
	}

}

3.Register类

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.*;

/**
 * 此类完成对注册页面的编写, 用户需填写 账户,密码
 * 
 * 并且会进行验证操作, 如姓名是否合法(中文)
 *
 */
@SuppressWarnings("serial")
public class Register extends JFrame implements ActionListener{
	
	JButton jb1, jb2;  //按钮
	JLabel jlb1, jlb2, jlb3,jlb4,jlb5, jlb6;  //标签
	JTextField jtf3,jtf4;   //文本框
	JPasswordField jpf; //密码框
	JPanel jp3, jp4,jp6,jp7;		//面板
	
	public Register() {
		// TODO Auto-generated constructor stub
		//按钮
		jb1 = new JButton("提交");
		jb2 = new JButton("登录");
		//设置按钮监听
		jb1.addActionListener(this);
		jb2.addActionListener(this);
		//标签信息
		
		jlb3 = new JLabel("     账号");
		jlb4 = new JLabel("     密码");
		jtf3 = new JTextField(13);
		jtf4 = new JTextField(13);
		
	
		jp3 = new JPanel();
		jp4 = new JPanel();
		jp6 = new JPanel();
		jp7 = new JPanel();
		//将对应信息加入面板中
		
		jp3.add(jlb3);
		jp3.add(jtf3);
		
		jp4.add(jlb4);
		jp4.add(jtf4);
		
		
		jp6.add(jb1);
		jp6.add(jb2);
		
		
		//将JPane加入JFrame中  
		this.add(jp7);  //先加入提示语
		
   
        this.add(jp3); 
        this.add(jp4);
   
        this.add(jp6);
        
        //设置布局
        this.setTitle("注册信息");
        this.setLayout(new GridLayout(5, 1));
        this.setSize(250, 240);   //设置窗体大小
        this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)  
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);  //设置仅关闭当前窗口
        
        this.setVisible(true);  //设置可见
        this.setResizable(false);	//设置不可拉伸大小
		
	}
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getActionCommand()=="提交")
		{
			try {
				register();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		else if (e.getActionCommand()=="登录")
		{
			new Login();
		}
		
	}
	//验证注册信息,并做处理
	public void register() throws IOException
	{
		//判断信息是否补全
		if (jtf3.getText().isEmpty()||jtf4.getText().isEmpty())
		{
			JOptionPane.showMessageDialog(null, "信息有空缺,请补全!","消息提示",JOptionPane.WARNING_MESSAGE);
		}
		
		//判断账户名和密码是否包含中文
		else if (new Check().checkcountname(jtf3.getText())||new Check().checkcountname(jtf4.getText()))
		{
			JOptionPane.showMessageDialog(null, "用户名或密码存在中文,不合法!","消息提示",JOptionPane.WARNING_MESSAGE);
		}
		//满足要求
		else if (!jtf3.getText().isEmpty()&&!jtf4.getText().isEmpty())
		{
			//注册成功, 打包为信息数组传递给UserMessage进行更新操作
			String []message = new String[2]; 
		
			message[0] = jtf3.getText();
			message[1] = jtf4.getText();
			if (new Check().check2(message[0]))   //调用Check的check方法检测用户是否存在, 如果不存在执行
			{
				new UserMessage().write(message);   //调用UserMseeage的write方法进行写操作, 将信息格式化存入
				JOptionPane.showMessageDialog(null,"注册成功!","提示消息",JOptionPane.WARNING_MESSAGE);
				dispose();  //使窗口消失
				
				new Login();
			}
			else 
			{
				JOptionPane.showMessageDialog(null,"账号已存在,请重新输入!","提示消息",JOptionPane.WARNING_MESSAGE);
				//dispose();
			}
		}
	}
	
	//清空账号和密码框
	private void clear() {
		// TODO Auto-generated method stub
	
	    jtf3.setText("");  
	    jtf4.setText("");  	
	}	
}

4.UserMessage类

import java.io.*;  
/**
 * 此类事对用户信息的 写入和读取操作
 *
 */
public class UserMessage
{
	/*
	 * 将注册的信息写入文本
	 */
	public void write(String[] message)throws IOException
	{
		File file=new File("Message.txt");
		String messagesum="";
		for (int i=0; i<2; i++)  //将信息格式化存储
			messagesum+=message[i]+"~";
        if(!file.exists())
            file.createNewFile();
        FileOutputStream out=new FileOutputStream(file,true); //建立输出对象,true表示追加       
        StringBuffer sb=new StringBuffer();      //创建字符串流
        sb.append(messagesum+"\n");				//向字符串流中添加信息
         out.write(sb.toString().getBytes("gb2312"));         //将字符串流中的信息写入文本
        out.close();			//关闭
	}
    /*
     *   读取信息,将用户名信息返回(如果不存在返回null),和Check类配合使用  
     */
	public String[] read(String countname) throws IOException
	{
        File file=new File("Message.txt");
        if(!file.exists()||file.isDirectory())
            throw new FileNotFoundException();
        BufferedReader br=new BufferedReader(new FileReader(file));
        String temp=null;
        StringBuffer sb=new StringBuffer();
        temp=br.readLine();
        
        String []message = new String[5];     //按~拆分 成5个字符串数组,按账号和密码进行信息验证
        while(temp!=null){
        	String sbstring = temp.toString();
        	int n = sbstring.length();            //测字符串长度
        	for (int i=0; i<5; i++)
        		message[i] = "";
        	
        	int k=0;
        	for (int i=0; i<n; i++)
        	{
        		if(sbstring.charAt(i)=='~')
        		{
        			//System.out.println("@"+message[k]);
        			k++;
        		}
        		else 
        		{
        			message[k] += sbstring.charAt(i);
        		}
        	}
        	if (message[2].equals(countname))  //返回找到用户的信息
        	{
        		return message;
        	}
            temp=br.readLine();
        }
        return null;
	}
	
	
	
	//
	//更新密码
	public String updatepwd(String countname,String pwd) throws IOException
	{
        File file=new File("Message.txt");
        if(!file.exists()||file.isDirectory())
            throw new FileNotFoundException(); 
        //读文件  
        BufferedReader br=new BufferedReader(new FileReader(file));
        String temp=null;
        StringBuffer sb=new StringBuffer();
        //写文件
        //FileOutputStream out=new FileOutputStream(file,false);        
        StringBuffer sb1=new StringBuffer();
        
        String moneystring="";
        
        temp=br.readLine();
        String []message = new String[2];     //按~拆分 成5个字符串数组,按账号和密码进行信息验证
        while(temp!=null){
        	String sbstring = temp.toString();
        	int n = sbstring.length();            //测字符串长度
        	for (int i=0; i<2; i++)
        		message[i] = "";
        	
        	int k=0;
        	for (int i=0; i<n; i++)      //拆乘5个String
        	{
        		if(sbstring.charAt(i)=='~')
        		{
        			//System.out.println("@"+message[k]);
        			k++;
        		}
        		else 
        		{
        			message[k] += sbstring.charAt(i);
        		}
        	}
        	
        	if (message[0].equals(countname))   //找到该账户名
        	{
        		//修改密码
        		for (int i=0; i<3; i++)
        			sb1.append(message[i]+"~");
        		sb1.append(pwd+"~");
        		sb1.append(message[4]+"~\n");
        	}
        	else
        	{
        		sb1.append(temp+"\n");
        	}
        	temp=br.readLine();
        }
        /*
         * 说明:
         * 本来的想法是在原文件对象中覆盖内容,但是发现覆盖后文本为空, 无法解决
         * 但重新创建文件对象,则可以完成操作
         */
        File file1=new File("Message.txt");
        if(!file1.exists())
           file1.createNewFile();
        FileOutputStream out=new FileOutputStream(file1,false);
        out.write(sb1.toString().getBytes("gb2312"));
        out.close();
        
		return moneystring;
	}

}

5.Check类

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Check {
	
	/**
	 * 在登录时, 验证账号密码是否正确
	 */
	public boolean  check1(String countname,String pwd) throws IOException{
		
		File file=new File("Message.txt");   //创建文件类
        if(!file.exists()||file.isDirectory()) //判断文件是否存在
            //throw new FileNotFoundException();
        	file.createNewFile();
        BufferedReader br=new BufferedReader(new FileReader(file)); //创建读入缓冲流,按行读入
        String temp=null;   
       // StringBuffer sb=new StringBuffer();   
        temp=br.readLine();   //先读取一行
        while(temp!=null){
        	String sbstring = temp.toString();   //转化为string
        	int n = sbstring.length();            //测字符串长度
        	String []message = new String[5];     //按~拆分 成5个字符串数组,按账号和密码进行信息验证
        	int k=0;
        	
        	for (int i=0; i<2; i++)
        		message[i]="";
        	//我们在写入用户时用~分割, 所以我们利用~在分割开来
        	for (int i=0; i<n; i++)
        	{
        		if(sbstring.charAt(i)=='~')
        		{
        			//System.out.println("@"+message[k]);
        			k++;
        		}
        		else 
        		{
        			message[k] += sbstring.charAt(i);
        		}
        	}
        	if (countname.equals(message[0])&&pwd.equals(message[1]))//比较账户密码是否相等
        		return true;
            temp=br.readLine();  //读取下一行
        }
        return false;
			
		
	}
	
	//在注册时 验证账号是否存在
	public boolean  check2(String countname) throws IOException{
		
		File file=new File("Message.txt");   //创建文件类
        if(!file.exists()||file.isDirectory()) //判断文件是否存在
        	file.createNewFile();
        BufferedReader br=new BufferedReader(new FileReader(file)); //创建读入缓冲流,按行读入
        String temp=null;   
       // StringBuffer sb=new StringBuffer();   
        temp=br.readLine();   //先读取一行
        while(temp!=null){
        	String sbstring = temp.toString();   //转化为string
        	int n = sbstring.length();            //测字符串长度
        	String []message = new String[5];     //按~拆分 成5个字符串数组,按账号和密码进行信息验证
        	int k=0;
        	
        	for (int i=0; i<5; i++)
        		message[i]="";
        	for (int i=0; i<n; i++)
        	{
        		if(sbstring.charAt(i)=='~')
        		{
        			//System.out.println("@"+message[k]);
        			k++;
        		}
        		else 
        		{
        			message[k] += sbstring.charAt(i);
        		}
        	}
        	if (!countname.equals(message[0]))
        		return true;//验证是否存在过此账号
            temp=br.readLine();
        }
        return false;
	}

	//验证用户名和密码是否为中文
	public boolean checkcountname(String countname)
	{
		 Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
	        Matcher m = p.matcher(countname);
	        if (m.find()) {
	            return true;
	        }
	        return false;
	}
	//验证姓名是否为中文
	public boolean checkname(String name)
	{
		int n = 0;
	    for(int i = 0; i < name.length(); i++) {
	        n = (int)name.charAt(i);
	        if(!(19968 <= n && n <40869)) {
	            return false;
	        }
	    }
	    return true;
	}
}

源码已上传码云:
https://gitee.com/wangjinchan/java-swing-login.git

  • 44
    点赞
  • 319
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 45
    评论
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一粒程序米

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值