Java Swing实现登陆窗口验证码

在这里插入图片描述
Java Swing实现如图窗口界面,点击右侧【看不清,换一张】可更换验证码。

Code.java

    package com.A;
    
    
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Cursor;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Insets;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.image.BufferedImage;
    import javax.swing.BorderFactory;
    import javax.swing.ButtonGroup;
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JTextField;
    import javax.swing.WindowConstants;
    import javax.swing.border.Border;
    
    
    public class Code extends JFrame {
    
    	public class RoundBorder implements Border {
    		 
    		 public Insets getBorderInsets(Component c) {
    		  return new Insets(0,0,0,0);
    		 }
    		 public boolean isBorderOpaque() {
    		  return false;
    		 }
    		 //绘制圆角按钮
    		 public void paintBorder(Component c, Graphics g, int x, int y,
    		   int width, int height) {
    		  //使用黑色在组件的外边缘绘制一个圆角矩形
    		  g.setColor(Color.BLACK);
    		  g.drawRoundRect(0, 0, c.getWidth()-1, c.getHeight()-1, 12, 12);
    		 }
    		}
    	
    	public void CreateJFrame() {
    	//界面背景图片
    		ImageIcon icon=new ImageIcon("src//images//background.jpg");
    		//Image im=new Image(icon);
    		//将图片放入label中
    		JLabel label=new JLabel(icon);
    		
    		//设置label的大小
    		label.setBounds(0,0,icon.getIconWidth(),icon.getIconHeight());
    		//窗口名称
    		JFrame jf = new JFrame("用户登陆");
    		jf.getLayeredPane().add(label,new Integer(Integer.MIN_VALUE));
    		JPanel j=(JPanel)jf.getContentPane();
    		j.setOpaque(false);
    		
    		JPanel panel=new JPanel();
    		panel.setOpaque(false);
    
    		
    		placeComponents(panel);
    		
    		jf.add(panel);
    		jf.setVisible(true);
    		jf.setSize(icon.getIconWidth(),icon.getIconHeight());
    		jf.setResizable(false);
    		//在屏幕中设置显示的位置
    		jf.setLocation(700,500);
    		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    	}
    	//设置窗口内各种组件
    	public void placeComponents(JPanel panel) {
    		panel.setLayout(null);
    		JLabel label1 = new JLabel("用户名");
    		Font zi=new Font("黑体",Font.TYPE1_FONT,20);
    		label1.setFont(zi);
    		label1.setBounds(155, 179, 70, 40);
    		panel.add(label1);
    		
    		JTextField text1 = new JTextField(20);
    		text1.setBounds(240,187,175,30);
    		//监听,当鼠标点击按钮会变色
    		text1.addMouseListener(new MouseListener () {
    		    private Border oldBorder;  
    		    @Override
    		    public void mouseClicked(MouseEvent e) {
    		    }
    		    @Override
    		    public void mousePressed(MouseEvent e) {
    		    }
    		    @Override
    		    public void mouseReleased(MouseEvent e) {
    		    }
    		    @Override
    		    public void mouseEntered(MouseEvent e) {	                 
    		        // 保存旧边框
    		        oldBorder = text1.getBorder(); 
    		        // 设置一个新边框
    		        text1.setBorder(BorderFactory.createLineBorder(new Color(0,128,255)));
    		    }
    		    @Override
    		    public void mouseExited(MouseEvent e) {
    		        // 还原旧边框
    		        text1.setBorder(oldBorder);
    		    }
    		});
    		panel.add(text1);
    		
    		JLabel label2 = new JLabel("密码");
    		Font zi1=new Font("黑体",Font.TYPE1_FONT,20);
    		label2.setFont(zi1);
    		label2.setBounds(155, 237, 70, 40);
    		panel.add(label2);
    		
    		JTextField text2 = new JTextField(20);
    		text2.setBounds(240,242,175,30);
    		text2.addMouseListener(new MouseListener () {
    		    private Border oldBorder;  
    		    @Override
    		    public void mouseClicked(MouseEvent e) {
    		    }
    		    @Override
    		    public void mousePressed(MouseEvent e) {
    		    }
    		    @Override
    		    public void mouseReleased(MouseEvent e) {
    		    }
    		    @Override
    		    public void mouseEntered(MouseEvent e) {	                 
    		        // 保存旧边框
    		        oldBorder = text2.getBorder(); 
    		        // 设置一个新边框
    		        text2.setBorder(BorderFactory.createLineBorder(new Color(0,128,255)));
    		    }
    		    @Override
    		    public void mouseExited(MouseEvent e) {
    		        // 还原旧边框
    		        text2.setBorder(oldBorder);
    		    }
    		});
    		panel.add(text2);
    		
    		JLabel label3 = new JLabel("验证码");
    		Font zi2=new Font("黑体",Font.TYPE1_FONT,20);
    		label3.setFont(zi2);
    		label3.setBounds(155, 290, 70, 40);
    		panel.add(label3);
    		
    		JTextField text3 = new JTextField(20);
    		text3.setBounds(240,295,175,30);
    		text3.addMouseListener(new MouseListener () {
    		    private Border oldBorder;  
    		    @Override
    		    public void mouseClicked(MouseEvent e) {
    		    }
    		    @Override
    		    public void mousePressed(MouseEvent e) {
    		    }
    		    @Override
    		    public void mouseReleased(MouseEvent e) {
    		    }
    		    @Override
    		    public void mouseEntered(MouseEvent e) {	                 
    		        // 保存旧边框
    		        oldBorder = text3.getBorder(); 
    		        // 设置一个新边框
    		        text3.setBorder(BorderFactory.createLineBorder(new Color(0,128,255)));
    		    }
    		    @Override
    		    public void mouseExited(MouseEvent e) {
    		        // 还原旧边框
    		        text3.setBorder(oldBorder);
    		    }
    		});
    		panel.add(text3);
    		//设置单选按钮
    		JRadioButton rb1=new JRadioButton("教师"); 
    		ButtonGroup group=new ButtonGroup();
    		Font zi3=new Font("黑体",Font.TYPE1_FONT,16);
    		rb1.setFont(zi3);
    		group.add(rb1);
    		rb1.setSelected(true);
    		rb1.setBounds(180, 360, 60, 25);
    		rb1.setBackground(new Color(204,204,255));
    		panel.add(rb1);
    		//设置单选按钮
    		JRadioButton rb2=new JRadioButton("学生"); 
    		rb2.setFont(zi3);
    		group.add(rb2);
    		rb2.setSelected(true);
    		rb2.setBounds(280, 360, 60, 25);
    		rb2.setBackground(new Color(204,204,255));
    		panel.add(rb2);
    		//设置单选按钮
    		JRadioButton rb3=new JRadioButton("访客"); 
    		rb3.setFont(zi3);
    		group.add(rb3);
    		rb3.setSelected(true);
    		rb3.setBounds(380, 360, 60, 25);
    		rb3.setBackground(new Color(204,204,255));
    		panel.add(rb3);
    		
    		JButton button1 = new JButton("登陆");
    		button1.setFont(zi3);
    		button1.setForeground(new Color(0,0,0));
    		button1.setBounds(220, 400, 60, 30);
    		button1.setBorder(new RoundBorder());
    		panel.add(button1);
    		
    		JButton button2 = new JButton("重置");
    		button2.setFont(zi3);
    		button2.setForeground(new Color(0,0,0));
    		button2.setBounds(340, 400, 60, 30);
    		button2.setBorder(new RoundBorder());
    		panel.add(button2);
    		
    		JLabel code = new JLabel();
    		Object[] obj = CodePicture.createImage();
    		ImageIcon img = new ImageIcon((BufferedImage)obj[1]);//创建图片对象
    		code.setIcon((Icon)img);
    		code.setBounds(450, 290,150, 50);
    		panel.add(code);
    		
    		String   strMsg1   =   "看不清";   
    		String   strMsg2   =   "换一张";   
    		String   strMsg = "<html><body>"+strMsg1+"<br>"+strMsg2+"<body></html>";
    		JLabel   change   =   new   JLabel(strMsg); 
    		//监听,鼠标进入文字就变成小手形状
    		change.addMouseListener(new MouseAdapter() {
    				public void mouseEntered(MouseEvent e) //鼠标进入
    				{
    					change.setForeground(Color.blue);
    					change.setCursor(new Cursor(Cursor.HAND_CURSOR));
    				}
    				public void mouseExited(MouseEvent e) //鼠标移除
    				{
    					change.setForeground(Color.black);
    					setCursor(Cursor.getDefaultCursor());
    				}
    		});
    
    				change.addMouseListener(new MouseAdapter() {
    					public void mouseClicked(MouseEvent e){
    						if(e.getClickCount() == 1){	
    							//重新获取验证码
    							Object[] obj1 = CodePicture.createImage();
    							ImageIcon img1 = new ImageIcon((BufferedImage)obj1[1]);//创建图片对象
    							code.setIcon((Icon)img1);
    							code.setBounds(450, 290,150, 50);
    							panel.add(code);
    						}
    					}
    				});
    		change.setBounds(550,290,100,40);
    		panel.add(change);
    	}
    
    
    	public static void main(String[] args) {
    		new Code().CreateJFrame();
    	}
    }

CodePicture.java

package com.A;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

//绘制验证码
public class CodePicture {
	// 验证码字符集
	private static final char[] chars = ("0123456789abcdefghijklmnopqrstuvwxyz"
			+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
	// 字符数量
	private static final int SIZE = 4;
	// 干扰线数量
	private static final int LINES = 10;
	// 宽度
	private static final int WIDTH = 80;
	// 高度
	private static final int HEIGHT = 40;
	// 字体大小
	private static final int FONT_SIZE = 30;//30

 
	/**
	 * 生成随机验证码及图片
	 */
	public static  Object[] createImage() {
		StringBuffer sb = new StringBuffer();
		// 1.创建空白图片
		BufferedImage image = new BufferedImage(
			WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
		// 2.获取图片画笔
		Graphics graphic = image.getGraphics();
		// 3.设置画笔颜色
		graphic.setColor(Color.LIGHT_GRAY);
		// 4.绘制矩形背景
		graphic.fillRect(0, 0, WIDTH, HEIGHT);
		// 5.画随机字符
		Random ran = new Random();
		for (int i = 0; i <SIZE; i++) {
			// 取随机字符索引
			int n = ran.nextInt(chars.length);
			// 设置随机颜色
			graphic.setColor(getRandomColor());
			// 设置字体大小
			graphic.setFont(new Font(
				null, Font.BOLD + Font.ITALIC, FONT_SIZE));
			// 画字符
			graphic.drawString(
				chars[n] + "", i * WIDTH / SIZE, HEIGHT/2+10);
			// 记录字符
			sb.append(chars[n]);
		}
		// 6.画干扰线
		for (int i = 0; i < LINES; i++) {
			// 设置随机颜色
			graphic.setColor(getRandomColor());
			// 随机画线
			graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),
					ran.nextInt(WIDTH), ran.nextInt(HEIGHT));
		}
		// 7.返回验证码和图片
		return new Object[]{sb.toString(), image};
	}
	
	/**
	 * 随机取色
	 */
	public static Color getRandomColor() {
		Random ran = new Random();
		Color color = new Color(ran.nextInt(256), 
				ran.nextInt(256), ran.nextInt(256));
		return color;
	}
	
}

附背景图片:

在这里插入图片描述

欢迎关注

掘金:https://juejin.cn/user/4156573190724030
Github:https://github.com/zhubingran
CSDN:https://blog.csdn.net/qq_43118757
QQ:1330022055

  • 8
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在Java Swing项目中实现验证码登录,你可以按照以下步骤进行设置: 1. 导入所需的库和包: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; ``` 2. 创建验证码生成方法: ```java private String generateCaptcha(int length) { String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; StringBuilder captcha = new StringBuilder(); Random random = new Random(); while (captcha.length() < length) { int index = random.nextInt(chars.length()); captcha.append(chars.charAt(index)); } return captcha.toString(); } ``` 3. 创建登录窗口并添加组件: ```java JFrame loginFrame = new JFrame("登录"); loginFrame.setSize(300, 200); loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); loginFrame.add(panel); panel.setLayout(new GridLayout(3, 2)); JLabel usernameLabel = new JLabel("用户名:"); panel.add(usernameLabel); JTextField usernameField = new JTextField(); panel.add(usernameField); JLabel passwordLabel = new JLabel("密码:"); panel.add(passwordLabel); JPasswordField passwordField = new JPasswordField(); panel.add(passwordField); JLabel captchaLabel = new JLabel("验证码:"); panel.add(captchaLabel); JTextField captchaField = new JTextField(); panel.add(captchaField); JButton loginButton = new JButton("登录"); panel.add(loginButton); ``` 4. 为登录按钮添加点击事件处理: ```java loginButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String username = usernameField.getText(); String password = new String(passwordField.getPassword()); String captcha = captchaField.getText(); // 验证验证 if (captcha.equals(generateCaptcha(4))) { // 执行登录逻辑 if (username.equals("your_username") && password.equals("your_password")) { JOptionPane.showMessageDialog(null, "登录成功"); // 登录成功后的操作 } else { JOptionPane.showMessageDialog(null, "用户名或密码错误"); } } else { JOptionPane.showMessageDialog(null, "验证码错误"); } } }); ``` 5. 显示登录窗口: ```java loginFrame.setVisible(true); ``` 注意:上述示例中的验证码生成方法 `generateCaptcha` 生成了一个由大小写字母和数字组成的随机验证码,长度为4。你可以根据自己的需求修改验证码生成的规则和长度。另外,在实际的应用中,你需要将用户名、密码和验证码与数据库或其他验证方式进行比较,以进行真正的登录验证

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值