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

news2024/12/23 16:41:32

目 录

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

说明

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

运行后的效果

登录窗体

代码

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();// 实例化AffineTransform
                trans.rotate(random.nextInt(45) * 3.14 / 180, 22 * i + 8, 7);//进行旋转
                float scaleSize = random.nextFloat() + 0.8f;// 缩放文字
                if (scaleSize > 1f)
                    scaleSize = 1f;// 如果scaleSize大于1,则等于1
                trans.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{//控制键按键动作控制

        @Override
        public 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{//文本框,焦点监听

        @Override
        public void focusGained(FocusEvent e) {//文本框获得焦点
            if (userNameTF.getText().equals("请输入用户名")){
                userNameTF.setText("");//文本框清空
                userNameTF.setFont(new Font("幼圆",Font.BOLD,14));//文本框用户输入文字格式
                userNameTF.setForeground(Color.BLACK);//文本框用户输入文字颜色
            }
        }

        @Override
        public 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{//密码框焦点监听

        @Override
        public 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('*');//密码框用户输入回显为“*”
            }
        }

        @Override
        public 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.coloradmin.cn/o/2264324.html

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

相关文章

《开启微服务之旅:Spring Boot 从入门到实践》(一)

Spring Boot Spring Boot 入门 Spring Boot 简介&#xff08;脚手架&#xff09; 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 优点&#xff1a;快速创建独立运行的spring项目以及与主流…

springboot466大学生就业服务平台(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统大学生就业服务平台信息管理难度大&#xff0c;容错率低&…

ROS1入门教程2:主题发布和订阅

一、创建发布者 创建源文件publisher.cpp&#xff0c;并写入以下内容&#xff1a; #include <iostream>#include "ros/ros.h" #include "std_msgs/String.h"int main(int argc, char* argv[]) {std::string nodeName "publisher"; // 节…

WALN无线网络的创建和管理-二层组网

⼆层组⽹配置过程&#xff1a; 在AC上配置DHCP 1&#xff0c;先将AP划分到管理vlan&#xff0c;并在相关链路上运⾏vlan数据通过 2&#xff0c;在AC上创建管理vlan的vlanif接⼝&#xff0c;配置IP参数 3&#xff0c;在AC上配置DHCP服务器 4&#xff0c;指定WLAN管理vlan&am…

EasyGBS国标GB28181平台P2P远程访问故障排查指南:客户端角度的排查思路

在现代视频监控系统中&#xff0c;P2P&#xff08;点对点&#xff09;技术因其便捷性和高效性而被广泛应用。然而&#xff0c;当用户在使用P2P远程访问时遇到设备不在线或无法访问的问题时&#xff0c;有效的排查方法显得尤为重要。本文将从客户端的角度出发&#xff0c;详细探…

基于Controller模式部署RocketMQ集群

RocketMQ简介 RocketMQ是一种分布式消息中间件&#xff0c;它由阿里巴巴集团开发&#xff0c;并且后来捐献给了Apache软件基金会。RocketMQ最初是为了解决阿里巴巴内部因业务增长带来的高吞吐量需求而设计的。随着其不断发展和完善&#xff0c;RocketMQ已经成为了一个能够处理…

性能】JDK和Jmeter的安装与配置

一、JDK环境配置 1. 下载JDK 官网下载地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html 选择对应系统的安装包&#xff0c;下载后安装&#xff0c;安装中记录JDK安装的地址&#xff0c;之后一直点击下一…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC&#xff08;Two-Phase Commit&#xff09;协议准备阶段提交阶段情况 1&#xff1a;只要有一个事务参与者反馈未就绪&#xff08;no ready&#xff09;&#xff0c;事务协调者就会回滚事务情况 2&#xff1a;当所有事务参与者均反馈就绪&#xff08;ready&a…

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…

RK3588 , mpp硬编码yuv, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件.

纯血鸿蒙APP实战开发——动态注册字体案例

介绍 本示例介绍利用上传下载模块和注册自定义字体模块实现从网络上下载字体并注册应用字体的功能&#xff0c;该场景多用于由特殊字体要求的场景。 效果图预览 使用说明 进入本案例页面后&#xff0c;可点击下方按钮切换字体。目前仅提供了思源宋体的注册&#xff0c;第一次…

Oracle中间件 SOA之 OSB 12C服务器环境搭建

环境信息 服务器基本信息 如下表&#xff0c;本次安装总共使用1台服务器&#xff0c;具体信息如下&#xff1a; App1服务器 归类 APP服务器 Ip Address 172.xx.30.xx HostName appdev01. xxxxx.com Alias appdev01 OSB1服务器 归类 OSB服务器 Ip Address 172.xx3…

数据结构---------二叉树前序遍历中序遍历后序遍历

以下是用C语言实现二叉树的前序遍历、中序遍历和后序遍历的代码示例&#xff0c;包括递归和非递归&#xff08;借助栈实现&#xff09;两种方式&#xff1a; 1. 二叉树节点结构体定义 #include <stdio.h> #include <stdlib.h>// 二叉树节点结构体 typedef struct…

前置知识补充—JavaScript

JavaScript 简介 JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名&#xff0c;但是它也被⽤到了很多⾮浏览器环境中 HTML&#xff1a; ⽹⻚的结构 CSS&#xff1a; …

Mac上详细配置java开发环境和软件(更新中)

文章目录 概要JDK的配置JDK下载安装配置JDK环境变量文件 Idea的安装Mysql安装和配置Navicat Premium16.1安装安装Vscode安装和配置Maven配置本地仓库配置阿里云私服Idea集成Maven Cpolar快速入门 概要 这里使用的是M3型片 14.6版本的Mac 用到的资源放在网盘 链接: https://pan…

第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题

第二十六周周报 摘要Abstract文献阅读《Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations》1. 引言2. 问题的设置3.偏微分方程的数据驱动解3.1 连续时间模型3.1.1 …

米思奇图形化编程之ESP32控制LED灯闪烁方案实现

目录 一、项目概述 二、硬件准备 三、硬件连接 四、软件编程 五、验证效果 六、总结 一、项目概述 本项目使用米思奇图形化编程环境&#xff0c;编写micropython软件代码&#xff0c;实现了控制ESP32开发板上LED灯闪烁效果。该项目可为后续更复杂的物联网项目打下基础。…

完全离线使用,效率直接拉满

现在越来越多的人使用OCR软件来提高自己的工作效率&#xff0c;今天给大家推荐一款电脑端的文字识别工具&#xff0c;对比以往的软件来说&#xff0c;功能更加丰富全面。 Umi-OCR 美术、舞蹈、音乐 打开软件之后需要安装一下。 软件主要有截图OCR识别、批量OCR识别、批量文档识…

CSDN外链失效3:

参考我之前的博客&#xff1a; 外链失效博客1&#xff1a;随想笔记1&#xff1a;CSDN写博客经常崩溃&#xff0c;遇到外链图片转存失败怎么办_csdn外链图片转存失败-CSDN博客 外链失效博客2&#xff1a;网络随想2&#xff1a;转语雀_md格式转语雀lake格式-CSDN博客 markdown…

Java 中的字符串

目录 Java 中的字符串字符串的创建字符串的比较字符串的拼接如何定义一个空的字符串 Java 中的字符串 字符串的创建 在 Java 中&#xff0c;可以通过以下几种方式创建字符串&#xff1a; 1.使用字符串字面量&#xff1a; String str "Hello, World!";2.使用 new…