java绘制验证码源码如下:包括一个JFrame继承类,一个JPanel继承类。
Main.java
package game;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Main extends JFrame {
private MyPanel panel;
private JButton button;
private ActionListener listener;
public Main(){
initial();
this.setSize(300,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
private void initial() {
createComponent();
layoutComponent();
listener();
}
private void createComponent() {
button = new JButton("change");
panel = new MyPanel();
}
private void layoutComponent() {
this.add(panel, BorderLayout.CENTER);
this.add(button, BorderLayout.SOUTH);
button.setActionCommand("change");
}
private void listener() {
listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("change")){
repaint();
}
}
};
button.addActionListener(listener);
}
public static void main(String[] args) {
Main test = new Main();
}
}
MyPanel.java如下
package game;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JPanel;
public class MyPanel extends JPanel {
private BufferedImage img;
private static final int WIDTH = 180;
private static final int HEIGHT = 40;
public MyPanel() {
}
@Override
public void paint(Graphics g1) {
String[] fonts = { "仿宋_GB2312", "方正舒体", "黑体", "华文彩云", "华文彩云", "隶书",
"宋体", "华文新魏", "微软雅黑", "幼圆,Arial", "Calibri", "Dotum",
"Algerian", "Broadway", "Curlz MT", "Brush Script MT",
"Elephant" };
img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
//设置背景颜色为白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
//画一个黑色的边框
g.setColor(Color.BLACK);
g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);
int x = 20;
int y = 30;
Random rn = new Random();
ArrayList<Integer> list = new ArrayList<Integer>();
//5个随机数
for (int i = 0; i < 5; i++) {
int n = rn.nextInt(10);
list.add(n);
}
//用不同的字体和颜色画每一个数字
for (int i = 0; i < list.size(); i++) {
int fi = rn.nextInt(fonts.length);
Font font = new Font(fonts[fi], Font.ITALIC, 27);
g.setFont(font);
Color color = new Color(rn.nextInt(256), rn.nextInt(256),
rn.nextInt(256));
g.setColor(color);
g.drawString(String.valueOf(list.get(i)), x, y);
x += 30;
}
// 干扰线
for (int i = 0; i < 50; i++) {
int x1 = rn.nextInt(WIDTH);
int y1 = rn.nextInt(HEIGHT);
int x2 = rn.nextInt(WIDTH);
int y2 = rn.nextInt(HEIGHT);
Color c = new Color(rn.nextInt(256), rn.nextInt(256),
rn.nextInt(256), rn.nextInt(50) + 50);
g.setColor(c);
g.drawLine(x1, y1, x2, y2);
}
g1.drawImage(img, 50, 50, WIDTH, HEIGHT, null);
}
}