未加入图片,可以将图片按自己需要加入
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.*;
public class Cap12306 extends JFrame {
JLabel[] jlCap = new JLabel[5];// 创建显示验证图标签数组
JCheckBox[] jcb = new JCheckBox[jlCap.length];// 创建复选框组件数组
JLabel jl;// 定义选择提示标签
String capRanName;// 定义要选择的验证图类别
int[] num = new int[jlCap.length];// 定义随机数变量数组
public static List<Capurl> cap12306list = new ArrayList<Capurl>();
public Cap12306() {// 构造方法初始化窗体
setTitle("图形验证码");// 窗体标题
setSize(500, 260);// 窗体大小
setLocationRelativeTo(null);// 窗体居中
setVisible(true);// 窗体可见
setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭方式
Container c = getContentPane();// 获取容器
c.setLayout(null);// 设置绝对布局
Font font = new Font("仿宋", Font.BOLD, 15);// 统一设置字体
this.jl = new JLabel();// 新增提示标签
this.jl.setBounds(10, 10, 220, 19); // 设置位置及大小
this.jl.setFont(font);
c.add(jl);// 向容器添加组件
for (int i = 0; i < jlCap.length; i++) {
this.jlCap[i] = new JLabel();// 验证图标签
this.jlCap[i].setBounds(10 + i * 93, 40, 88, 88);
c.add(jlCap[i]);
this.jcb[i] = new JCheckBox("选择");// 复选框标签
this.jcb[i].setBounds(25 + i * 93, 140, 70, 30);
this.jcb[i].setFont(font);
c.add(jcb[i]);
}
changeCap();// 设置5张随机验证图和要选择的验证图类别
JButton enter = new JButton("确认");// 确认按钮
enter.setFont(font);
enter.setBounds(240, 180, 70, 26);
c.add(enter);
JButton change = new JButton("换一组");
change.setFont(font);
change.setBounds(340, 180, 85, 26); // 更换验证图按钮
c.add(change);
change.addActionListener(new ActionListener() {// 更换验证图按钮触发事件
@Override
public void actionPerformed(ActionEvent args) {
changeCap();
}
});
enter.addActionListener(new ActionListener() {// 确定按钮触发事件匿名内部类
@Override
public void actionPerformed(ActionEvent args) {
if (ifCap()) {// 验证图勾选正确则弹出正确对话框,否则弹出错误对话框
JOptionPane.showMessageDialog(null, "验证通过,将进入系统!", "图形验证码", JOptionPane.WARNING_MESSAGE);
System.exit(0);// 退出程序
} else {
JOptionPane.showMessageDialog(null, "验证失败,请重新验证!", "图形验证码", JOptionPane.ERROR_MESSAGE);
changeCap();// 更换验证图
}
}
});
}
public boolean hasRan(int c, int ran) {// 判断随机数是否重复方法
for (int i = 0; i < c; i++) {
if (num[i] == ran) {
return true;// 有重复
}
}
return false;// 不重复
}
public void changeCap() {// 更换验证图方法
Random random = new Random();
for (int i = 0; i < num.length; i++) {
int ran = random.nextInt(cap12306list.size());
while (hasRan(i, ran)) {
ran = random.nextInt(cap12306list.size());
}
num[i] = ran;
Capurl capurl = cap12306list.get(num[i]);
this.jlCap[i].setIcon(capurl.iconUrl);// 重新设置验证图
this.jcb[i].setSelected(false);
}
int ran = num[random.nextInt(num.length)];// 5张验证图中随机抽取一张
capRanName = cap12306list.get(ran).name;
jl.setText("请点击下面图中 所有的" + capRanName);// 更新提示信息
}
public boolean ifCap() {// 验证勾选验证图是否正确
for (int i = 0; i < num.length; i++) {
if (cap12306list.get(num[i]).name.equals(capRanName)) {
if (!jcb[i].isSelected()) {
return false;// 应勾选未勾选
}
} else {
if (jcb[i].isSelected()) {
return false;// 勾选了不应勾选的
}
}
}
return true;// 全部勾选正确
}
public static void iniList(String name, int c) {// 初始化验证图信息
for (int i = 1; i <= c; i++) {
cap12306list.add(new Capurl(name, "img_cap12306/" + name + '/' + name + i + ".png"));
}
}
public static void main(String[] args) {
iniList("本子", 6);// 批量添加验证图信息
iniList("蜡烛", 6);
iniList("礼花", 6);
iniList("牌坊", 6);
iniList("塔", 6);
iniList("跳绳", 6);
iniList("土豆", 6);
iniList("钟", 6);
new Cap12306();
}
}
class Capurl {// 用来存储验证图类别和地址的类
String name;
Icon iconUrl;
Capurl(String name, String url) {
this.name = name;
this.iconUrl = new ImageIcon(url);
}
}
- 作者:麦克猫Cat
- 本文版权归作者和CSDN共有,欢迎交流