java Swing中随机验证码的实现

LoginJFrame:(登录界面)

package com.myproject.ui;

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
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 com.myproject.bean.User;
import com.myproject.uiutils.ValidCode;
import com.myproject.userdao.UserDAOFactory;

public class LoginJFrame extends JFrame {

	private static final long serialVersionUID = 1L;
	private JLabel lb_backgroud;// 背景
	private JLabel label = new JLabel("目标管理系统");
	private JLabel username = new JLabel("用户名:");
	private JLabel password = new JLabel("密    码:");
	private JLabel validcode = new JLabel("验证码:");
	private JPanel jp1 = new JPanel();// 标题面板
	private JTextField jtf_user = new JTextField();
	private JPasswordField jpf_pwd = new JPasswordField();
	private JTextField jtf_code = new JTextField();
	private JButton btn_login = new JButton("登录");
	private JButton btn_regist = new JButton("注册");
	private ValidCode vcode;

	public LoginJFrame() {
		showUI();
		BtnLoginAddActionListener();
		setBackgroudImage();
	}

	/**
	 * 初始化登录窗体背景
	 */
	private void setBackgroudImage() {
		((JPanel) this.getContentPane()).setOpaque(false);
		ImageIcon img = new ImageIcon("images/beijing1.jpg"); // 添加图片
		lb_backgroud = new JLabel(img);
		this.getLayeredPane().add(lb_backgroud, new Integer(Integer.MIN_VALUE));
		lb_backgroud.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
	}

	private void showUI() {
		this.setTitle("南华大学目标管理系统");
		this.setSize(450, 350);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);

		Container c = this.getContentPane();
		c.setLayout(null);

		label.setFont(new Font("宋体", 0, 30));
		// jp1.setBackground(Color.gray);
		jp1.add(label);
		jp1.setBounds(100, 30, 250, 45);
		jp1.setOpaque(false);
		c.add(jp1);

		username.setBounds(80, 90, 60, 40);
		password.setBounds(80, 140, 60, 40);
		validcode.setBounds(80, 190, 60, 40);

		jtf_user.setBounds(140, 90, 180, 40);
		jtf_user.setOpaque(false);
		jpf_pwd.setBounds(140, 140, 180, 40);
		jpf_pwd.setOpaque(false);
		jtf_code.setBounds(140, 190, 100, 40);

		btn_login.setBounds(120, 250, 80, 40);
		setJButton(btn_login);
		btn_regist.setBounds(220, 250, 80, 40);
		setJButton(btn_regist);

		c.add(username);
		c.add(password);
		c.add(validcode);
		c.add(jtf_user);
		c.add(jpf_pwd);
		c.add(jtf_code);
		vcode = new ValidCode();
		vcode.setBounds(240, 190, 80, 40);
		c.add(vcode);
		c.add(btn_login);
		c.add(btn_regist);

		this.setVisible(true);

	}

	/**
	 * 为了适应各种不同尺寸大小的窗口都能显示在屏幕中间位置,相当于setLocationRelativeTo(null) private void
	 * setCenter(){ Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension d =
	 * toolkit.getScreenSize(); int x = (int)(d.getWidth()-getWidth())/2; int y
	 * = (int)(d.getHeight()-getHeight())/2; this.setLocation(x, y); }
	 */

	/**
	 * 给登录按钮添加监听
	 */
	public void BtnLoginAddActionListener() {
		btn_login.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (!isValidCodeRight()) {
					JOptionPane.showMessageDialog(LoginJFrame.this, "验证码错误!");
				}
				if (isValidCodeRight()) {

					String userName = jtf_user.getText();
					String passWord = String.valueOf(jpf_pwd.getPassword());
					User user = new User();
					user.setUsername(userName);
					user.setPassword(passWord);
					Boolean flag = false;
					try {
						flag = UserDAOFactory.getUserDAOInstance().findLogin(
								user);
					} catch (Exception e1) {
						e1.printStackTrace();
					}

					// 判断
					if (!flag) {
						JOptionPane.showMessageDialog(LoginJFrame.this,
								"用户名或密码错误,请重输!");
					} else {
						System.out.println("登录成功!!!");
						new MainJFrame().init();
						LoginJFrame.this.dispose();
					}
				}
			}
		});
	}

	/**
	 * 给注册按钮添加监听
	 */
	public void BtnRegistAddActionListener() {
		btn_regist.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {

			}
		});
	}

	/**
	 * 设置按钮风格:透明
	 * 
	 * @param btn
	 */
	private void setJButton(JButton btn) {
		btn.setBackground(new Color(102, 0, 204));// 紫色
		btn.setFont(new Font("Dialog", Font.BOLD, 24));
		btn.setOpaque(false);
		btn.setBorder(BorderFactory.createEmptyBorder());
	}

	/**
	 * 验证码的校验
	 * 
	 * @return
	 */
	public boolean isValidCodeRight() {

		if (jtf_code == null) {
			return false;
		}
		if (vcode == null) {
			return true;
		}
		if (vcode.getCode().equals(jtf_code.getText())) {
			return true;
		}
		return false;
	}

}

ValidCode:随机验证码的实现类

package non.zy.login;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.AffineTransform;
import java.util.Random;

import javax.swing.JComponent;

public class ValidCode extends JComponent implements MouseListener {

	private String code;

	private int width, height = 40;

	private int codeLength = 4;

	private Random random = new Random();

	public ValidCode() {
		width = this.codeLength * 16 + (this.codeLength - 1) * 10;
		setPreferredSize(new Dimension(width, height));
		setSize(width, height);
		this.addMouseListener(this);
		setToolTipText("点击可以更换验证码");
	}

	public int getCodeLength() {
		return codeLength;
	}

	/*
	设置验证码文字的长度
	*/
	public void setCodeLength(int codeLength) {
		if(codeLength < 4) {
			this.codeLength = 4;
		} else {
			this.codeLength = codeLength;
		}
		
	}

	public String getCode() {
		return code;
	}

	/*
		产生随机的颜色
	*/
	public Color getRandColor(int min, int max) {

		if (min > 255)
			min = 255;
		if (max > 255)
			max = 255;
		int red = random.nextInt(max - min) + min;
		int green = random.nextInt(max - min) + min;
		int blue = random.nextInt(max - min) + min;
		return new Color(red, green, blue);
	}
	/*
		设置验证码具体的字母是什么
	*/
	protected String generateCode() {
		char[] codes = new char[this.codeLength];
		for (int i = 0, len = codes.length; i < len; i++) {
			if (random.nextBoolean()) {
				codes[i] = (char) (random.nextInt(26) + 65);
			} else {
				codes[i] = (char) (random.nextInt(26) + 97);
			}
		}
		this.code = new String(codes);
		return this.code;
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		if(this.code == null || this.code.length() != this.codeLength) {
			this.code = generateCode();
		}
		width = this.codeLength * 16 + (this.codeLength - 1) * 10;
		super.setSize(width, height);
		super.setPreferredSize(new Dimension(width, height));
		Font mFont = new Font("Arial", Font.BOLD | Font.ITALIC, 25);
		g.setFont(mFont);
		//绘制出验证码的背景的矩形轮廓
		Graphics2D g2d = (Graphics2D) g;
		g2d.setColor(getRandColor(200, 250));
		g2d.fillRect(0, 0, width, height);
		g2d.setColor(getRandColor(180, 200));
		g2d.drawRect(0, 0, width - 1, height - 1);
		//绘制出验证码背景的线
		int i = 0, len = 150;
		for (; i < len; i++) {
			int x = random.nextInt(width - 1);
			int y = random.nextInt(height - 1);
			int x1 = random.nextInt(width - 10) + 10;
			int y1 = random.nextInt(height - 4) + 4;
			g2d.setColor(getRandColor(180, 200));
			g2d.drawLine(x, y, x1, y1);
		}
		
		/*i = 0; len = 300;
		for (; i < len; i++) {
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			g2d.setColor(getRandColor(150, 180));
			g2d.drawRect(x, y, 0, 0);
		}*/

		//绘制出验证码的具体字母
		i = 0; len = this.codeLength;
		FontMetrics fm = g2d.getFontMetrics();
		int base = (height - fm.getHeight())/2 + fm.getAscent();
		for(;i<len;i++) {
			int b = random.nextBoolean() ? 1 : -1;
			g2d.rotate(random.nextInt(10)*0.01*b);
			g2d.setColor(getRandColor(20, 130));
			g2d.drawString(code.charAt(i)+"", 16 * i + 10, base);
		}
	}

	//下一个验证码
	public void nextCode() {
		generateCode();
		repaint();
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		
		nextCode();
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

界面效果图:


版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 Java Swing 的 Graphics2D 类来绘制验证码,并使用 Random 类来生成随机字符和颜色。以下是一个简单的示例: ```java import javax.swing.*; import java.awt.*; import java.util.Random; public class CaptchaPanel extends JPanel { // 验证码字符集 private static final String CHAR_SET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // 验证码长度 private static final int CODE_LENGTH = 4; @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 设置背景颜色 g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, getWidth(), getHeight()); // 生成随机验证码 Random random = new Random(); StringBuilder code = new StringBuilder(); for (int i = 0; i < CODE_LENGTH; i++) { code.append(CHAR_SET.charAt(random.nextInt(CHAR_SET.length()))); } // 绘制验证码 int x = 10; int y = 20; for (int i = 0; i < CODE_LENGTH; i++) { // 设置随机颜色 g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); // 设置随机字体 g2d.setFont(new Font(Font.SANS_SERIF, Font.BOLD, random.nextInt(10) + 20)); g2d.drawString(String.valueOf(code.charAt(i)), x, y); x += 30; } // 绘制干扰线 for (int i = 0; i < 10; i++) { g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g2d.drawLine(random.nextInt(getWidth()), random.nextInt(getHeight()), random.nextInt(getWidth()), random.nextInt(getHeight())); } } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 150); frame.setLocationRelativeTo(null); frame.add(new CaptchaPanel()); frame.setVisible(true); } } ``` 在这个示例,我们首先设置了背景颜色为白色,然后使用 Random 类生成随机验证码。接着,我们使用 Graphics2D 类的 drawString() 方法绘制验证码,并使用随机颜色和字体。最后,我们使用 drawLine() 方法绘制干扰线,增加验证码的安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值