ERoslon青年 2022-09-30 00:37 采纳率: 100%
浏览 29
已结题

怎么登录界面获取正确的用java画版画出的验证码

问题:怎么登录界面获取正确的用java画版画出的验证码,然后用该验证码进行登录判断

登录界面函数

package com.Jason.ui;
import com.Jason.tool.CodeUtil;
import com.Jason.tool.User;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
//登录界面
public class LoginJFame extends JFrame implements MouseListener {
    //创建一个集合存储正确的用户名和密码
    static ArrayList<User> list = new ArrayList<>();

    static {
        list.add(new User("HJH", "HJH123456"));
        list.add(new User("yyx", "yyx123456"));
        list.add(new User("yzs", "yzs123456"));
        list.add(new User("lzk", "lzk123456"));
    }

    //创建Toolkit的实现类,并获取工具包
    Toolkit tk = Toolkit.getDefaultToolkit();
    //创建可以用与改变图标的变量,存储图片
    java.awt.Image img = tk.getImage("image\\Icon.png");
    //创建CodeUtil的实现类,并获取工具包
    CodeUtil codeUtil = new CodeUtil();
    //初始化正确的验证码
    String codeStr = "";
    //计算器
    private int num = 0;
    //创建登录按钮
    JButton signIn = new JButton();
    //创建注册的按钮
    JButton register = new JButton();
    //创建更新验证码的按钮
    JButton change = new JButton();
    //创建用户名的文本输入框
    JTextField userField = new JTextField();
    //创建密码的文本输入框
    JPasswordField passwordField = new JPasswordField();
    //创建验证码的输入框
    JTextField codeField = new JTextField();


    public LoginJFame() {
        //界面初始化
        initJFrame();
        //初始化界面的组件
        initUnit();
        //让界面显示出来,建议写在最后
        this.setVisible(true);
    }

    //界面初始化方法
    private void initJFrame() {
        this.setSize(488, 430);
        //设置界面的标题
        this.setTitle("拼图游戏登录");

        //设置界面图标
        this.setIconImage(img);

        //设置界面置顶
        this.setAlwaysOnTop(true);

        //设置界面居中
        this.setLocationRelativeTo(null);

        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //取消内部默认布局
        this.setLayout(null);
    }

    //初始化界面的组件
    private void initUnit() {
        //创建一个容器管理用户名图片
        JLabel jLabelUser = new JLabel(new ImageIcon("image\\login\\用户名.png"));
        //设置用户名图片的位置与宽高
        jLabelUser.setBounds(116, 135, 47, 17);
        //设置用户名的文本输入框的位置与宽高
        userField.setBounds(195, 134, 200, 30);

        //创建一个容器管理密码图片
        JLabel jLabelPassword = new JLabel(new ImageIcon("image\\login\\密码.png"));
        //设置密码图片的位置与宽高
        jLabelPassword.setBounds(116, 195, 47, 17);
        //设置密码的文本输入框的位置与宽高
        passwordField.setBounds(195, 190, 200, 30);

        //创建一个容器管理验证码图片
        JLabel jLabelCode = new JLabel(new ImageIcon("image\\login\\验证码.png"));
        //设置验证码图片的位置与宽高
        jLabelCode.setBounds(116, 246, 50, 30);
        //设置验证码的文本输入框的位置与宽高
        codeField.setBounds(195, 246, 100, 30);

        //设置codeUtil类的位置与大小
        codeUtil.setBounds(300, 240, 100, 40);

        //设置验证码刷新按钮的背景图
        change.setIcon(new ImageIcon("image\\Change.png"));
        //设置验证码刷新按钮位置与宽高
        change.setBounds(410, 240, 30, 35);
        //去除按钮的默认边框
        change.setBorderPainted(false);
        //去除按钮的默认背景
        change.setContentAreaFilled(false);
        //给验证码刷新按钮绑定鼠标事件
        change.addMouseListener(this);

        //设置登录按钮的背景图
        signIn.setIcon(new ImageIcon("image\\login\\登录按钮.png"));
        //设置登录的按钮位置与宽高
        signIn.setBounds(123, 310, 128, 47);
        //去除按钮的默认边框
        signIn.setBorderPainted(false);
        //去除按钮的默认背景
        signIn.setContentAreaFilled(false);
        //给登录按钮绑定鼠标事件
        signIn.addMouseListener(this);

        //设置注册按钮的背景图
        register.setIcon(new ImageIcon("image\\login\\注册按钮.png"));
        //设置注册按钮的位置与宽高
        register.setBounds(256, 310, 128, 47);
        //去除按钮的默认边框
        register.setBorderPainted(false);
        //去除按钮的默认背景
        register.setContentAreaFilled(false);
        //给注册按钮绑定鼠标事件
        register.addMouseListener(this);

        //创建一个容器管理背景图片
        JLabel background = new JLabel(new ImageIcon("image\\login\\background.png"));
        //设置背景图的位置与宽高
        background.setBounds(0, 0, 470, 390);

        //将组件添加到主界面中
        this.getContentPane().add(jLabelUser);
        this.getContentPane().add(userField);
        this.getContentPane().add(jLabelPassword);
        this.getContentPane().add(passwordField);
        this.getContentPane().add(jLabelCode);
        this.getContentPane().add(codeField);
        this.getContentPane().add(codeUtil);
        this.getContentPane().add(change);
        this.getContentPane().add(signIn);
        this.getContentPane().add(register);
        this.getContentPane().add(background);
    }

    //判断用户名和密码是否正确
    public boolean checkUP(String user, String password) {
        for (int i = 0; i < list.size(); i++) {
            User aim = list.get(i);
            String aimUser = aim.getUserName();
            String aimPassword = aim.getPassword();
            if (aimUser.equals(user) && aimPassword.equals(password)) {
                return true;
            }
        }
        return false;
    }

    //要展示用户名,密码和验证码的情况
    public void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //设置弹框图标
        jDialog.setIconImage(tk.getImage("image\\Icon.png"));
        //给弹框设置大小
        jDialog.setSize(190, 150);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);
        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 190, 130);
        jDialog.getContentPane().add(warning);

        //让弹框展示出来
        jDialog.setVisible(true);
    }


    @Override
    public void mouseClicked(MouseEvent e) {
        Object obj = e.getSource();
        if (obj == change) {
            if (codeUtil != null) {
                //刷新一下界面,把旧的组件清除
                this.getContentPane().repaint();
                //显示验证码
                codeStr = codeUtil.getNum();
                //获取新的验证码
                System.out.println(codeStr);
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
        Object obj = e.getSource();
        if (obj == signIn) {
            signIn.setIcon(new ImageIcon("image\\login\\登录按下.png"));
        } else if (obj == register) {
            register.setIcon(new ImageIcon("image\\login\\注册按下.png"));
        }

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        Object obj = e.getSource();
        if (obj == signIn) {
            signIn.setIcon(new ImageIcon("image\\login\\登录按钮.png"));
        } else if (obj == register) {
            register.setIcon(new ImageIcon("image\\login\\注册按钮.png"));
        }
        if (obj == signIn) {
            //从用户名框里读取用户名
            String userName = userField.getText();
            //从密码框里读取密码
            char[] tempPassword = passwordField.getPassword();
            String password = new String(tempPassword);
            //从验证码框里读取验证码
            String code = codeField.getText();
            //提示信息
            String info = "";
            if (userName == null || userName.isEmpty()) {
                // 判断用户名是否为null或空的字符串
                info = "用户名为空,请输入用户名";
            } else if (password == null || password.isEmpty()) {
                // 判断密码是否为null或空的字符串
                info = "密码为空,请输入密码";
            } else if (code == null || code.isEmpty()) {
                // 判断用户名是否为null或空的字符串
                info = "验证码为空,请输入验证码";
            } else if (!codeStr.equalsIgnoreCase(code)) {
                info = "验证码错误,请重新输入";
                System.out.println(codeStr);
                //清空验证码输入框
                codeField.setText("");
                num++;
                if (num == 3) {
                    //刷新一下界面,把旧的组件清除
                    this.getContentPane().repaint();
                    //获取新的验证码
                    codeStr = codeUtil.getNum();
                    //重置计算器
                    num = 0;

                }
            } else if (checkUP(userName, password)) {
                // 如果checkUP函数为真,则登录成功
                info = "登录成功!";
                //跳转到游戏函数
                //GameJFrame gameJFrame = new GameJFrame();
                //this.setVisible(false);
            } else{
                info = "用户名或密码错误!";
                //清空用户名输入框
                userField.setText("");
                //清空密码输入框
                passwordField.setText("");
                //清空验证码输入框
                codeField.setText("");
                //刷新一下界面,把旧的组件清除
                this.getContentPane().repaint();
                //获取新的验证码
                codeStr = codeUtil.getNum();
            }
            //加载弹窗显示信息
            showJDialog(info);
        } else if (obj == register) {
            String info = "<html>该功能尚未开发,敬请期待!
内部账号请看游戏账号文档!</html>"
; showJDialog(info); } } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }

CodeUtil函数

package com.Jason.tool;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

//在此类中规定作为随机验证码的26个字母;
//在面板中绘制出随机输出的验证码字母;验证码需要随机调整角度,大小。

public class CodeUtil extends JPanel {
    // 随机数实例化
    Random r = new Random();
    //验证码
    private String code = "";

    public CodeUtil() {
        //取消界面组件默认居中
        setLayout(null);
        //界面显示
        this.setVisible(true);
    }

    public void paint(Graphics g) {
        // 验证码的字母
        String wenZiStr = "abcdefghijklmnopqrstuvmxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
        BufferedImage image = new BufferedImage(120, 35, BufferedImage.TYPE_INT_BGR);
        Graphics graphics = image.getGraphics();
        if (!this.code.isEmpty()) {
            this.code = "";
        }
        //设置字体
        graphics.setFont(new Font("楷体", Font.BOLD, 20));
        //设置画版的位置与大小
        graphics.fillRect(0, 0, 120, 35);
        //添加验证码背景图
        Image bgImage = null;
        try {
            bgImage = ImageIO.read(new File("image\\VCG.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        image.getGraphics().drawImage(bgImage, 0, 0, 120, 35, null);
        for (int i = 0; i < 4; i++) {//生成四个待验证的文字
            int index = r.nextInt(wenZiStr.length());
            String s = wenZiStr.substring(index, index + 1);// 截取字段
            this.code = this.code + s;// 验证码新增截取字段
            graphics.setColor(Color.blue);
            Graphics2D g2d = (Graphics2D) graphics;
            AffineTransform transform = new AffineTransform();
            transform.rotate(r.nextInt(45) * 3.14 / 180, 22 * i + 8, 7);// 随机转动
            float scaleSize = r.nextFloat() + 0.8f;// 缩放文字
            if (scaleSize > 1f)
                scaleSize = 1f;// 如果scaleSize大于1,则等于1
            transform.scale(scaleSize, scaleSize); // 进行缩放
            g2d.setTransform(transform);// 设置AffineTransform对象
            graphics.drawString(s, 120 / 6 * i + 20, 35 / 2);// 画出验证码
        }
        //添加干扰线
        for (int i = 0; i < 2; i++) {
            int x1 = r.nextInt(20);// 第一条线起始X坐标
            int x2 = r.nextInt(30) + 35;// 第二条线起始X坐标,第一条线的终止X坐标
            int x3 = r.nextInt(30) + 90;// 第二条线的终止X坐标
            int y1 = r.nextInt(20);// 第一条线的Y坐标
            int y2 = r.nextInt(10) + 20;// 第二条线起始Y坐标,第一条线的终止Y坐标
            int y3 = r.nextInt(10) + 5;// 第二条线的终止Y坐标
            graphics.setColor(Color.black);
            graphics.drawLine(x1, y1, x2, y2);
            graphics.drawLine(x2, y2, x3, y3);
            g.drawImage(image, 0, 0, null);
        }
    }

    public void draw() {
        repaint();// 重新绘制验证码
    }

    public String getNum() {
        return code;// 返回验证码
    }
}

APP函数,创建对象调用登录界面

import com.Jason.ui.LoginJFame;
public class App {
    public static void main(String[] args) {
        LoginJFame loginJFame = new LoginJFame();
    }
}
  • 写回答

0条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 系统已结题 10月8日
      • 创建了问题 9月30日

      悬赏问题

      • ¥15 maftools不能library
      • ¥15 vce文件应该如何修改内容
      • ¥25 随机森林二分类预测不均匀
      • ¥15 求助!!c语言作业(新了解的
      • ¥15 starccm流域异常
      • ¥15 并行程序时间性能计算比较
      • ¥15 正点原子stm32实验55网络通信打开LWIP_NETCONN会报错
      • ¥15 Linux关于FTP服务器配置的问题(很基础)
      • ¥15 求助!python作业
      • ¥50 求一份TAP网卡驱动修改版