我主要使用使用 Java Swing 库创建一个 GUI 窗口,然后在窗口中显示生成的算术验证码图片,并提供一个文本框和一个按钮,输入验证码并验证显示结果。
代码如下:
package calculate;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
public class ArithmeticValidateCodeExample extends JFrame implements ActionListener {
private static final int WIDTH = 100; // 图片宽度
private static final int HEIGHT = 80; // 图片高度
private static final int FONT_SIZE = 20; // 字体大小
private BufferedImage image; // 验证码图片
private String arithmeticExpression; // 算术表达式
private int arithmeticResult; // 算术表达式的结果
private JLabel label; // 显示算术表达式和"请输入验证码结果"
private JTextField textField; // 获取用户输入的结果
public ArithmeticValidateCodeExample() {
// 生成算术表达式和结果
arithmeticExpression = generateArithmeticExpression();
arithmeticResult = calculateArithmeticExpression(arithmeticExpression);
// 创建验证码图片
image = generateValidateCodeImage(arithmeticExpression);
// 设置JFrame的属性
setSize(WIDTH + 80, HEIGHT + 100); // 加上100的高度为了留出空间放"请输入验证码结果"和输入框
setLocationRelativeTo(null);
setTitle("算数验证码");
// 创建一个JLabel用于显示验证码图片
JLabel imageLabel = new JLabel(new ImageIcon(image));
getContentPane().add(imageLabel, BorderLayout.NORTH);
// 添加"请输入验证码结果"和输入框及"验证"按钮
label = new JLabel("请输入验证码结果:");
textField = new JTextField(8);
JButton button = new JButton("验证");
button.addActionListener(this);
JPanel inputPanel = new JPanel(new FlowLayout());
inputPanel.add(label);
inputPanel.add(textField);
inputPanel.add(button);
getContentPane().add(inputPanel, BorderLayout.CENTER);
}
public static void main(String[] args) {
ArithmeticValidateCodeExample example = new ArithmeticValidateCodeExample();
example.setVisible(true);
example.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
String userInput = textField.getText();
int userResult = Integer.parseInt(userInput);
if (userResult == arithmeticResult) {
JOptionPane.showMessageDialog(null, "验证通过!");
} else {
JOptionPane.showMessageDialog(null, "验证失败!");
}
}
private static String generateArithmeticExpression() {
int number1 = (int) (Math.random() * 100);
int number2 = (int) (Math.random() * 100);
int operator = (int) (Math.random() * 4);
char operatorChar;
switch (operator) {
case 0:
operatorChar = '+';
break;
case 1:
operatorChar = '-';
break;
case 2:
operatorChar = '*';
break;
case 3:
operatorChar = '/';
break;
default:
operatorChar = '+';
}
return number1 + " " + operatorChar + " " + number2;
}
private static int calculateArithmeticExpression(String arithmeticExpression) {
String[] components = arithmeticExpression.split(" ");
int number1 = Integer.parseInt(components[0]);
char operator = components[1].charAt(0);
int number2 = Integer.parseInt(components[2]);
int result;
switch (operator) {
case '+':
result = number1 + number2;
break;
case '-':
result = number1 - number2;
break;
case '*':
result = number1 * number2;
break;
case '/':
result = number1 / number2;
break;
default:
result = 0;
}
return result;
}
private static BufferedImage generateValidateCodeImage(String arithmeticExpression) {
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
// 设置背景颜色
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
// 设置字体样式和大小
Font font = new Font(Font.DIALOG, Font.BOLD, FONT_SIZE);
g.setFont(font);
// 设置验证码文本颜色
g.setColor(Color.BLACK);
// 绘制算术表达式的文本
g.drawString(arithmeticExpression, 10, HEIGHT / 2 - FONT_SIZE);
// 添加干扰线
for (int i = 0; i < 5; i++) {
int x1 = (int) (Math.random() * WIDTH);
int y1 = (int) (Math.random() * HEIGHT);
int x2 = (int) (Math.random() * WIDTH);
int y2 = (int) (Math.random() * HEIGHT);
g.drawLine(x1, y1, x2, y2);
}
// 噪点数量
int noiseCount = WIDTH * HEIGHT / 5;
for (int i = 0; i < noiseCount; i++) {
int x = (int) (Math.random() * WIDTH);
int y = (int) (Math.random() * HEIGHT);
int rgb = getRandomColor().getRGB();
image.setRGB(x, y, rgb);
}
g.dispose();
return image;
}
private static Color getRandomColor() {
int r = (int) (Math.random() * 256);
int g = (int) (Math.random() * 256);
int b = (int) (Math.random() * 256);
return new Color(r, g, b);
}
}