java实现登录窗口
作者:mlee1018 发布时间:2023-11-24 18:09:31
标签:java,登录窗口
本文实例为大家分享了java实现登录窗口的具体代码,供大家参考,具体内容如下
登录窗口主类
package ccnu.paint;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import ccnu.util.Answer;
import ccnu.util.Verification;
public class Login extends JFrame
{
private static final long serialVersionUID = 1L;
private Properties pro = new Properties();
private boolean ver_code = false; // 默认输入验证码错误
private Answer answer = null;
private JPanel p1 = new JPanel(); // 添加到JPanel中的组件默认为流式布局
private JLabel luser = new JLabel("username: ");
private JTextField username = new JTextField(20);
private JPanel p2 = new JPanel();
private JLabel lpwd = new JLabel("password: ");
private JPasswordField pwd = new JPasswordField(20);
private JPanel p4 = new JPanel();
private JLabel lVer = new JLabel("verification: ");
private JTextField ver = new JTextField(10);
private JLabel img = new JLabel();
private JLabel result = new JLabel();
private JPanel p3 = new JPanel();
private JButton ok = new JButton("ok");
private JButton cancel = new JButton("cancel");
private JButton signUp = new JButton("Sign up"); // 用于账户注册
// 设置组件的监听
public void initListener()
{
username.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{// JTextField的action是回车键
String name = username.getText();
// Login.this.setTitle(name);
// System.out.println(name.hashCode() + "***" +"".hashCode());
if (name.equals(""))
{
JOptionPane.showMessageDialog(Login.this, "Please input a userName!");
} else
{
pwd.grabFocus();
}
}
});
pwd.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e)
{
String password = new String(pwd.getPassword());
if(password.equalsIgnoreCase(""))
{
JOptionPane.showMessageDialog(Login.this, "please input a password!");
}else{
ver.grabFocus();
}
}
});
ok.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e)
{
// 重新加载最新的账户文件
try
{
pro.load(new FileInputStream(new File("src/res/accouts.properties")));
} catch (IOException e1)
{
e1.printStackTrace();
}
check();
}
});
// 判断验证码是否正确
ver.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e)
{
String verCode = ver.getText();
if(verCode.equals(""))
{
JOptionPane.showMessageDialog(Login.this, "Please input a verification!");
}else{
if(verCode.equals(answer.getResult()))
{
result.setIcon(new ImageIcon(Login.this.getClass().getResource("/res/right.jpg"))); // 显示提示的图片信息(如√图片)
ver_code = true;
// 检查之前,重新加载最新的账户文件
try
{
pro.load(new FileInputStream(new File("src/res/accouts.properties"))); // 将账户文件加载进来
} catch (IOException e1)
{
e1.printStackTrace();
}
check();
}else{
result.setIcon(new ImageIcon(Login.this.getClass().getResource("/res/error.jpg"))); // 显示提示的图片信息(如×图片)
ver_code = false;
}
}
}
});
// 点击图片会更改验证码
img.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e)
{
answer = Verification.verification();
img.setIcon(new ImageIcon(answer.getBufferedImage())); // 设置验证码图案
}
});
cancel.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
int option = JOptionPane.showConfirmDialog(Login.this, "Are you sure to exit?");
// System.out.println("option = " + option);
if (option == 0)
{// Yes
Login.this.dispose();
}
}
});
signUp.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e)
{
new SignUp();
}
});
}
// 初始化登录窗口及其组件的设置监听
public Login()
{
super("Login");
// 加载账户文件
try
{
pro.load(new FileInputStream(new File("src/res/accouts.properties"))); // 从指定位置将账户文件加载进来
} catch (IOException e)
{
e.printStackTrace();
}
initListener();
answer = Verification.verification(); // 生成验证码
img.setIcon(new ImageIcon(answer.getBufferedImage())); // 设置初始验证码
this.setLocation(new Point(200, 200));
this.setSize(500, 300);
this.setLayout(new GridLayout(4, 1, 0, 20)); // 垂直间隙为20px
p1.add(luser);
p1.add(username);
p2.add(lpwd);
p2.add(pwd);
p4.add(this.lVer);
p4.add(this.ver);
p4.add(this.img);
result.setForeground(Color.red);
result.setFont(new Font("楷体", Font.BOLD, 20));
p4.add(result);
p3.add(ok);
p3.add(cancel);
p3.add(signUp);
this.add(p1);
this.add(p2);
this.add(p4);
this.add(p3);
// this.setBackground(Color.blue); // JFrame的上层还有一个ContentPane
this.getContentPane().setBackground(Color.gray);
this.setResizable(false);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 等价于Frame中的windowClosing事件
}
// 检查用户名或密码
public void check()
{
String verCode = ver.getText();
if(verCode.equals(""))
{
JOptionPane.showMessageDialog(Login.this, "Please input a verification!");
return;
}else{
if(verCode.equals(answer.getResult()))
{
result.setIcon(new ImageIcon(Login.this.getClass().getResource("/res/right.jpg")));
ver_code = true;
}else{
result.setIcon(new ImageIcon(Login.this.getClass().getResource("/res/error.jpg")));
ver_code = false;
}
}
if(ver_code == false)
{
JOptionPane.showMessageDialog(this, "verification is error!");
return;
}
String name = username.getText();
String password = new String(pwd.getPassword()); // return char[]
// if (name.equalsIgnoreCase("admin") && password.equals("123456"))
if (isPass(name, password))
{
// new PaintApp(name);
JOptionPane.showMessageDialog(this, "-^_^- OK..."); // 此处可以加上其他的登陆成功后进一步处理的窗口
this.dispose();
} else
{
JOptionPane.showMessageDialog(this, "userName or password is incorrect!");
username.setText("");
pwd.setText("");
ver.setText("");
answer = Verification.verification();
img.setIcon(new ImageIcon(answer.getBufferedImage()));
result.setIcon(null);
}
}
// 验证用户输入的账户名和密码是否正确(通过与加载进来的账户 pro 比对)
public boolean isPass(String name, String password)
{
Enumeration en = pro.propertyNames();
while(en.hasMoreElements())
{
String curName = (String)en.nextElement();
// System.out.println(curName + "---" + pro.getProperty(curName));
if(curName.equalsIgnoreCase(name))
{
if(password.equalsIgnoreCase(pro.getProperty(curName)))
{
return true;
}
}
}
return false;
}
public static void main(String[] args)
{
new Login();
}
}
账户注册类
package ccnu.paint;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class SignUp extends JFrame
{
private static final long serialVersionUID = 3054293481122038909L;
private Properties pro = new Properties(); // 最好时静态的,因为账户是共享的
private JPanel panel = new JPanel();
private JLabel label = new JLabel("username: ");
private JTextField field = new JTextField(15);
private JPanel panel2 = new JPanel();
private JLabel label2 = new JLabel("password: ");
private JPasswordField field2 = new JPasswordField(15);
private JPanel panel3 = new JPanel();
private JLabel label3 = new JLabel("confirmation: ");
private JPasswordField field3 = new JPasswordField(15);
private JPanel panel4 = new JPanel();
private JButton button = new JButton("OK");
private JButton button2 = new JButton("Cancel");
public void initListener()
{
field.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
field2.grabFocus();
}
});
field2.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
field3.grabFocus();
}
});
field3.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
ok_actionPerformed(e);
}
});
// OK
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
ok_actionPerformed(e);
}
});
// Cancel
button2.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
cancel_actionPerformed(e);
}
});
}
public void ok_actionPerformed(ActionEvent e)
{
String userName = field.getText();
String password = new String(field2.getPassword());
String password2 = new String(field3.getPassword());
if (userName.equals(""))
{
JOptionPane.showMessageDialog(SignUp.this, "username cannot be empty!");
} else
{
if (password.equalsIgnoreCase(""))
{
JOptionPane.showMessageDialog(SignUp.this, "password cannot be empty!");
} else
{
if (password2.equalsIgnoreCase(password))
{
if (isExist(userName))
{
JOptionPane.showMessageDialog(SignUp.this, "username has been existed!");
field.setText("");
field2.setText("");
field3.setText("");
} else
{
pro.setProperty(userName, password);
JOptionPane.showMessageDialog(SignUp.this, "SignUp success!");
writeToPro(userName, password); // 将其写入到账户文件中
SignUp.this.dispose();
}
} else
{
JOptionPane.showMessageDialog(SignUp.this, "password is not consistent!");
field2.setText("");
field3.setText("");
}
}
}
}
public void cancel_actionPerformed(ActionEvent e)
{
System.exit(0);
}
public SignUp()
{
super("Sign up");
// 加载账户文件
try
{
pro.load(new FileInputStream(new File("src/res/accouts.properties")));
} catch (IOException e)
{
e.printStackTrace();
}
// 初始化窗口组件的监听
initListener();
this.setLocation(new Point(300, 230));
this.setSize(280, 210);
this.setLayout(new GridLayout(4, 1, 0, 20)); // 垂直间隙为20px
panel.add(label);
panel.add(field);
panel2.add(label2);
panel2.add(field2);
panel3.add(label3);
panel3.add(field3);
panel4.add(button);
panel4.add(button2);
this.add(panel);
this.add(panel2);
this.add(panel3);
this.add(panel4);
this.setAlwaysOnTop(true);
this.setResizable(false);
this.setVisible(true);
}
// 如果注册始终可用,就要保存起来,否则不需要写入文件中,注册账户本次使用
// 将账户名与其对应密码保存到指定的账户文件中
public void writeToPro(String userName, String password)
{
pro.setProperty(userName, password);
try
{
pro.store(new FileOutputStream(new File("src/res/accouts.properties")), "allAccouts");
} catch (IOException e)
{
e.printStackTrace();
}
}
// 判断此用户名是否已经存在
public boolean isExist(String userName)
{
Enumeration enumer = pro.propertyNames();
while (enumer.hasMoreElements())
{
String temp = (String) enumer.nextElement();
if (temp.equals(userName))
{
return true;
}
}
return false;
}
}
生成验证码类
package ccnu.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.util.Random;
// 用于生成验证码
public class Verification
{
private static Answer answer = new Answer();
private static BufferedImage bufferedImage = null;
private static String result = null;
private static String words = null;
private static String words2 = null;
// 生成验证码
public static Answer verification()
{
bufferedImage = new BufferedImage(200, 35, BufferedImage.TYPE_INT_RGB);
Graphics g = bufferedImage.getGraphics();
Random rand = new Random();
for (int i = 0; i < 20; i++)
{
Point p1 = new Point(rand.nextInt(200), rand.nextInt(30));
Point p2 = new Point(rand.nextInt(200), rand.nextInt(30));
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
g.setColor(Color.RED);
g.setFont(new Font("楷体", Font.BOLD, 22));
int plan = 2;
switch (rand.nextInt(plan))
{
case 0:
plan(g);
break;
case 1:
plan1(g);
break;
default:
break;
}
answer.setBufferedImage(bufferedImage);
answer.setResult(result);
g.dispose();
return answer;
}
// 方案一
private static void plan(Graphics g)
{
words = ReadTxt.read("/res/words.txt"); // 指定生成验证码问题的资源文件的路径
Random rand = new Random();
String first = String.valueOf(words.charAt(rand.nextInt(words.length())));
String second = String.valueOf(words.charAt(rand.nextInt(words.length())));
String third = String.valueOf(words.charAt(rand.nextInt(words.length())));
g.drawString(first, rand.nextInt(40) + 20, rand.nextInt(12) + 15);
g.drawString(second, rand.nextInt(40) + 80, rand.nextInt(12) + 15);
g.drawString(third, rand.nextInt(40) + 140, rand.nextInt(12) + 15);
result = first + second + third;
}
// 方案二
private static void plan1(Graphics g)
{
words2 = ReadTxt.read("/res/words2.txt"); // 指定生成验证码问题的资源文件的路径
Random rand = new Random();
String first = String.valueOf(words2.charAt(rand.nextInt(words2.length() - 2)));
String second = String.valueOf(words2.charAt(rand.nextInt(2) + 9));
String third = String.valueOf(words2.charAt(rand.nextInt(words2.length() - 2)));
g.drawString(first, rand.nextInt(30) + 20, rand.nextInt(12) + 15);
g.drawString(second, rand.nextInt(40) + 60, rand.nextInt(12) + 15);
g.drawString(third, rand.nextInt(30) + 110, rand.nextInt(12) + 15);
g.drawString("=", rand.nextInt(40) + 150, rand.nextInt(12) + 15);
if(second.equals("+"))
{
result = String.valueOf(Integer.valueOf(first) + Integer.valueOf(third));
}else{
result = String.valueOf(Integer.valueOf(first) - Integer.valueOf(third));
}
}
}
读取生成验证码所需文件类
package ccnu.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 专门用于读取文件
public class ReadTxt
{
public static String read(String path) // 根据指定路径path来读取它,并返回它所包含的内容
{
StringBuffer sb = new StringBuffer();
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(Verification.class.getResourceAsStream(path)));
String temp = null;
while(null != (temp = br.readLine()))
{
sb.append(temp);
}
br.close();
} catch (IOException e)
{
e.printStackTrace();
}
return sb.toString();
}
}
得到生成的验证码所包含的信息类(图案、问题)
package ccnu.util;
import java.awt.image.BufferedImage;
// 用于将生成的验证码的图案信息以及问题结果封装
public class Answer
{
private BufferedImage bufferedImage = null; // 验证码图像
private String result = null; // 验证码图像问题的答案
public BufferedImage getBufferedImage()
{
return bufferedImage;
}
public void setBufferedImage(BufferedImage bufferedImage)
{
this.bufferedImage = bufferedImage;
}
public String getResult()
{
return result;
}
public void setResult(String result)
{
this.result = result;
}
}
验证码生成汉字识别的问题的文件words.txt
如: 中国湖北省武汉市汉东大学政法学院
验证码生成算术运算的问题的文件words2.txt
123456789+-
提示图片
登录效果
来源:https://blog.csdn.net/Recall_Tomorrow/article/details/70475027
0
投稿
猜你喜欢
- 本文实例讲述了c#与js随机数生成方法。分享给大家供大家参考。具体如下:1. C#产生随机数方法:Random rd = new Rando
- 引言: Spring Boot号称微服务的利器,在结合了Spring Data与JPA之后,更是如虎添翼,开发快速的不像话,本文将讲述一个关
- 小编为面试Java程序员的朋友们整理了2017非常热门的面试中的笔试试题,如果你是一个正在准备面试Java程序员的读者,赶快学习一下吧。1,
- 前言今天给大家带来一个国产SM4加密解密算法的java后端解决方案,代码完整,可以直接使用,希望给大家带来帮助,尤其是做政府系统的开发人员,
- 本文实例讲述了C#中TreeView节点的自定义绘制方法。分享给大家供大家参考。具体如下:if ((e.State & TreeNo
- 简介DataBinding 是 Jetpack 组件之一,适用于 MVVM 模式开发,也是Google官方推荐使用的组件之一。使用DataB
- 我们日常的工作中都使用开发工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的调试程序,或者是通过打包工具把项目打包成 j
- 本文主要是分析Spring bean的循环依赖,以及Spring的解决方式。 通过这种解决方式,我们可以应用在我们实际开发项目中。1. 什么
- Spring AOP对嵌套方法不起作用今天在调研系统操作记录日志时,好多教程都是借助于Spring AOP机制来实现。于是也采用这种方法来实
- 开发缘由:公司需要调用天眼查-开放平台 ,验证客户的的营业执照信息是否在存续期,并将企业基本信息返回,之后和使用百度图文识别的企业信息进行对
- C#延时函数使用在线程中如果需要延时,尽量不要使用Sleep()函数,这样会导致时间片切到别的线程中。使用如下函数:
- 如下所示:package cn.sunzn.md5;import java.security.MessageDigest;import ja
- 一、下载rocketmq对应版本源码修改消息存储路径需要修改rocketmq源码,因为rocketmq取的默认路径是user.home路径,
- java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用
- 上篇博文:Java-多线程的使用equals与==1. ==的使用1.1 概述⭕ 用于基本类型比较值时:只要两个变量的值相等,即为true。
- 1、接口:一种把类抽象的更彻底,接口里只能包含抽象方法的“特殊类”。接口不关心类的内部状态数据,定义的是一批类所遵守的规范。(它只规定这批类
- 本文实例讲述了Java实现的日期处理类。分享给大家供大家参考,具体如下:开发中常常要使用日期,先小结如下,以备后用。import java.
- JVM与DalvikAndroid应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Dal
- 效果如下:BitmapShader 的简单介绍关于 Shader是什么,Shader的种类有哪几种以及如何使用不属于本文范畴,对这方面不是很
- 本文实例讲述了Java实现Http工具类的封装操作。分享给大家供大家参考,具体如下:http工具类的实现:(通过apache包)第一个类im