java Swing中随机验证码的实现

来源:互联网 发布:ppt图表无法编辑数据 编辑:程序博客网 时间:2024/06/05 23:48

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() {@Overridepublic 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() {@Overridepublic 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;}@Overrideprotected 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();}@Overridepublic void mouseClicked(MouseEvent e) {nextCode();}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}

界面效果图:


0 0
原创粉丝点击