用JAVA做了一个登录窗体练习

server/2024/12/24 0:00:05/

目 录

  • 说明
  • 运行后的效果
  • 代码

说明

做了一个登录窗体作为练习,分享给大家,其中涉及到窗体、图板、随机数等内容,为了方便和我一样的小白可以看的比较明白,所以尽量详细的标注了注释,希望能帮到同样在学习路上的朋友

运行后的效果

登录窗体

代码

java">import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;public class LoginWindow extends JFrame {//定义全局属性private BufferedImage image;//验证码背景图像属性,使用带缓存的图片类封装private DrawingBoard drawingBoard;//验证码绘图板属性private JTextField userNameTF;//用户名文本框属性private JPasswordField userPasswordField;//密码框属性private JTextField captchaText;//验证码输入框属性private String captcha = "";//存储验证码Random random = new Random();//实例化随机类public LoginWindow(){//构造窗体//窗体主体结构参数setTitle("带验证码的登录窗口");//标题setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭方式setResizable(false);//设置窗口大小不可调setBounds(100,100,500,280);//窗体位置及大小//定义窗体内主体布局变量JPanel userInfo = new JPanel();//全局布局属性userInfo.setLayout(null);//窗体布局为空,元件位置均由代码确定//用户名文字标签JLabel userName = new JLabel("用户名:");//标签文本为【用户名】userName.setFont(new Font("宋体",Font.BOLD,14));//设置文本字体格式userName.setBounds(40,60,60,20);//设置位置和大小//用户名输入文本框设置userNameTF = new JTextField("请输入用户名",20);//文本框默认文字及长度userNameTF.setFont(new Font("幼圆",Font.ITALIC,14));//文本框字体格式userNameTF.setForeground(Color.GRAY);//默认文本的字体颜色userNameTF.setLocation(120,59);//文本框位置userNameTF.setSize(300,22);//文本框大小//密码文字标签JLabel userPassword = new JLabel("密码:");//标签为【密码】userPassword.setFont(new Font("宋体",Font.BOLD,14));//设置文本字体格式userPassword.setBounds(40,100,60,20);//设置位置和大小//密码输入密码框设置userPasswordField = new JPasswordField("请输入密码",20);//密码框默认文字及长度userPasswordField.setFont(new Font("幼圆",Font.ITALIC,14));//密码框字体格式userPasswordField.setForeground(Color.GRAY);//默认文本的字体颜色userPasswordField.setBounds(120,99,300,22);//密码框位置大小userPasswordField.setEchoChar((char)0);//默认文字回显为明码//验证码文字标签JLabel captcha = new JLabel("验证码:");//标签为【验证码】captcha.setFont(new Font("宋体",Font.BOLD,14));//设置文本字体格式captcha.setBounds(40,140,60,20);//设置位置和大小//验证码文本框设置captchaText = new JTextField();captchaText.setFont(new Font("幼圆",Font.ITALIC,14));//文本框字体格式captchaText.setBounds(120,139,100,22);//文本框位置大小//验证码背景图片实体化对象drawingBoard = new DrawingBoard();drawingBoard.setBounds(240,130,100,35);//位置和大小//【换一张】按钮设置JButton captchaButt = new JButton("换一张");//实体化按钮,并设置按键名文本captchaButt.setFont(new Font("宋体",Font.BOLD,14));//按键名文本格式captchaButt.setForeground(Color.BLUE);//按键名字体颜色captchaButt.setBorderPainted(false);//边框设置为无captchaButt.setBackground(Color.WHITE);//按键背景颜色设置为白色captchaButt.setBounds(360,140,80,22);//按键位置及大小//【登录】按钮设置JButton loginBt = new JButton("登  录");//实体化按钮,并设置按键名文本loginBt.setFont(new Font("宋体",Font.BOLD,16));//按键名文本格式loginBt.setBounds(120,190,100,30);//按键位置及大小//【重置】按钮设置JButton resetBt = new JButton("重  置");//实体化按钮,并设置按键名文本resetBt.setFont(new Font("宋体",Font.BOLD,16));//按键名文本格式resetBt.setBounds(260,190,100,30);//按键位置及大小//将所有原件添加到全局布局中userInfo.add(userName);userInfo.add(userNameTF);userInfo.add(userPassword);userInfo.add(userPasswordField);userInfo.add(captcha);userInfo.add(captchaText);userInfo.add(drawingBoard);userInfo.add(captchaButt);userInfo.add(loginBt);userInfo.add(resetBt);//将全局布局添加到窗体中,并居中放置add(userInfo,BorderLayout.CENTER);//监听按键captchaButt.addActionListener(new Control());loginBt.addActionListener(new Control());resetBt.addActionListener(new Control());userNameTF.addFocusListener(new TextFocus());userPasswordField.addFocusListener(new PasswordFocus());}class DrawingBoard extends JPanel{//创建验证码绘图板public static final int WIDTH = 120;//验证码宽度public static final int HEIGHT = 35;//验证码高度public void paint(Graphics g){//paint为默认方法try {//为验证码背景图片赋值image = ImageIO.read(new File("src/image1.jpg"));}catch (IOException e){e.printStackTrace();}//创建新图层BufferedImage img = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_3BYTE_BGR);Graphics gs = img.getGraphics();gs.setFont(new Font("黑体",Font.BOLD,20));gs.fillRect(0,0,WIDTH,HEIGHT);img.getGraphics().drawImage(image,0,0,WIDTH,HEIGHT,null);//如果验证码不为空,则清空if (!captcha.isEmpty()){captcha = "";}//生成验证码for (int i=0;i<4;i++){char ctmp = (char) (random.nextInt(26) + 65); // 生成A~Z的字母captcha += ctmp;// 更新验证码Color color = new Color(20 + random.nextInt(120), 20 + random.nextInt(120), 20 + random.nextInt(120));// 生成随机颜色gs.setColor(color); // 设置颜色Graphics2D gs2d = (Graphics2D) gs;// 将文字旋转指定角度AffineTransform trans = new AffineTransform();// 实例化AffineTransformtrans.rotate(random.nextInt(45) * 3.14 / 180, 22 * i + 8, 7);//进行旋转float scaleSize = random.nextFloat() + 0.8f;// 缩放文字if (scaleSize > 1f)scaleSize = 1f;// 如果scaleSize大于1,则等于1trans.scale(scaleSize, scaleSize); // 进行缩放gs2d.setTransform(trans);// 设置AffineTransform对象gs.drawString(String.valueOf(ctmp), WIDTH / 6 * i + 28, HEIGHT / 2);// 画出验证码g.drawImage(img,0,0,this);//反馈验证码到窗体}}}class Control implements ActionListener{//控制键按键动作控制@Overridepublic void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("换一张")){//按下【换一张】按键后drawingBoard.repaint();//刷新验证码}else if (e.getActionCommand().equals("登  录")){String name = userNameTF.getText();//读取用户名String password = new String(userPasswordField.getPassword());//读取密码String code = captchaText.getText();//读取验证码String userInfo = "";//用户登录信息返回if (name.equals("请输入用户名") || name.isEmpty()){userInfo = userInfo+"用户名为空,请输入用户名;";}if (password.equals("请输入密码") || password.isEmpty()){userInfo = userInfo+"密码为空,请输入密码;";}if (code.isEmpty() || !code.equalsIgnoreCase(captcha)){userInfo = userInfo+"验证码错误,请重新输入";drawingBoard.repaint();//更新验证码captchaText.setText("");//恢复验证码框初始值}if (userInfo.isEmpty()){userInfo = userInfo+"登录成功";userNameTF.setText("请输入用户名");//恢复用户名初始值userNameTF.setFont(new Font("幼圆",Font.ITALIC,14));//文本框字体格式userNameTF.setForeground(Color.GRAY);//默认文本的字体颜色userPasswordField.setText("请输入密码");//恢复密码框初始值userPasswordField.setFont(new Font("幼圆",Font.ITALIC,14));//密码框字体格式userPasswordField.setForeground(Color.GRAY);//默认文本的字体颜色userPasswordField.setEchoChar((char)0);//默认文字回显为明码captchaText.setText("");//恢复验证码框初始值drawingBoard.repaint();//更新验证码}JOptionPane.showMessageDialog(null,userInfo);//显示提示弹窗}else if (e.getActionCommand().equals("重  置")){userNameTF.setText("请输入用户名");//恢复用户名初始值userNameTF.setFont(new Font("幼圆",Font.ITALIC,14));//文本框字体格式userNameTF.setForeground(Color.GRAY);//默认文本的字体颜色userPasswordField.setText("请输入密码");//恢复密码框初始值userPasswordField.setFont(new Font("幼圆",Font.ITALIC,14));//密码框字体格式userPasswordField.setForeground(Color.GRAY);//默认文本的字体颜色userPasswordField.setEchoChar((char)0);//默认文字回显为明码captchaText.setText("");//恢复验证码框初始值drawingBoard.repaint();//更新验证码}}}class TextFocus implements FocusListener{//文本框,焦点监听@Overridepublic void focusGained(FocusEvent e) {//文本框获得焦点if (userNameTF.getText().equals("请输入用户名")){userNameTF.setText("");//文本框清空userNameTF.setFont(new Font("幼圆",Font.BOLD,14));//文本框用户输入文字格式userNameTF.setForeground(Color.BLACK);//文本框用户输入文字颜色}}@Overridepublic void focusLost(FocusEvent e) {//文本框失去焦点if (userNameTF.getText().isEmpty()){userNameTF.setText("请输入用户名");//恢复文本框默认值userNameTF.setFont(new Font("幼圆",Font.ITALIC,14));//文本框默认值字体userNameTF.setForeground(Color.GRAY);//文本框默认值颜色}else{userNameTF.setFont(new Font("幼圆",Font.BOLD,14));//文本框用户输入文字格式userNameTF.setForeground(Color.BLACK);//文本框用户输入文字颜色}}}class PasswordFocus implements FocusListener{//密码框焦点监听@Overridepublic void focusGained(FocusEvent e) {//密码框获得焦点String password = new String(userPasswordField.getPassword());//获取密码框的值if(password.equals("请输入密码")) {userPasswordField.setText("");//密码框清空userPasswordField.setFont(new Font("幼圆",Font.BOLD,14));//密码框用户输入文字格式userPasswordField.setForeground(Color.BLACK);//密码框用户输入文字颜色userPasswordField.setEchoChar('*');//密码框用户输入回显为“*”}}@Overridepublic void focusLost(FocusEvent e) {//密码框失去焦点String password = new String(userPasswordField.getPassword());//获取密码框的值if (password.isEmpty()){userPasswordField.setText("请输入密码");//密码框默认文字userPasswordField.setFont(new Font("幼圆",Font.ITALIC,14));//密码框默认文字格式userPasswordField.setForeground(Color.GRAY);//默认文本的字体颜色userPasswordField.setEchoChar((char)0);//默认文字回显为明码}else {userPasswordField.setFont(new Font("幼圆",Font.BOLD,14));//密码框用户输入文字格式userPasswordField.setForeground(Color.BLACK);//密码框用户输入文字颜色userPasswordField.setEchoChar('*');//密码框用户输入回显为“*”}}}public static void main(String[] args) {new LoginWindow().setVisible(true);//运行窗体,并设置为元素可见}
}

http://www.ppmy.cn/server/152613.html

相关文章

vue下拉加载页面切换回到当前滚动位置

当项目是下拉分页加载数据时&#xff0c;当离开页面再次回到当前页面时&#xff0c;数据会从第一页重新加载&#xff0c;这就会造成不好的体验。所以解决办法就是在离开当前页面时记录当前滚动的位置&#xff0c;然后再下次回到当前页面时&#xff0c;跳转到当前记录的位置。触…

【Python使用】嘿马头条项目从到完整开发教程第9篇:缓存,1 缓存穿透【附代码文档】

本教程的知识点为:简介 1. 内容 2. 目标 产品效果 ToutiaoWeb虚拟机使用说明 数据库 理解ORM 作用 思考&#xff1a; 使用ORM的方式选择 数据库 SQLAlchemy操作 1 新增 2 查询 all() 数据库 分布式ID 1 方案选择 2 头条 使用雪花算法 &#xff08;代码 toutiao-backend/common/…

HTMLCSS:这个动态删除按钮打几分?

这段HTML和CSS代码创建了一个可交互的按钮&#xff0c;该按钮在鼠标悬停时会展开显示一个删除图标和文字标签 演示效果 HTML&CSS <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-U…

ubuntu 如何重装你的apt【apt-get报错: symbol lookup error/undefined symbol】

副标题:解决error:apt-get: symbol lookup error: /lib/x86_64-linux-gnu/libapt-private.so.0.0: undefined symbol: _ZNK13pkgTagSection7FindULLENS_3KeyERKy, version APTPKG_6.0 文章目录 问题描述报错分析解决方案:重装你的apt1、查看你的ubuntu版本2、下载适配你的ap…

elementui在任意页面点击消息,弹出消息对应页面处理弹窗

需求&#xff1a;在系统的任意页面点击消息都能弹出对应页面中的操作弹窗 思路&#xff1a; 1、创建一个全局组件&#xff0c;这个组件要能在任何地方都被打开&#xff08;所以放在了app.vue页面&#xff09; 2、使用component 组件找到要打开的页面路径 3、在被打开的页面中…

大数据新视界 -- Hive 数据仓库:架构深度剖析与核心组件详解(上)(1 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

ExcelVBA编程输出ColorIndex与对应颜色色谱

标题 ExcelVBA编程输出ColorIndex与对应颜色色谱 正文 解决问题编程输出ColorIndex与对应色谱共56&#xff0c;打算分4纵列输出&#xff0c;标题是ColorIndex,Color,Name 1. 解释VBA中的ColorIndex属性 在VBA&#xff08;Visual Basic for Applications&#xff09;中&#xff…

虚拟机VMware的安装问题ip错误,虚拟网卡

要么没有虚拟网卡、有网卡远程连不上等 一般出现在win11 家庭版 1、是否IP错误 ip addr 2、 重置虚拟网卡 3、查看是否有虚拟网卡 4、如果以上检查都解决不了问题 如果你之前有vmware 后来卸载了&#xff0c;又重新安装&#xff0c;一般都会有问题 卸载重装vmware: 第一…