我们很经常会遇到需要输入验证码的情况,那么,验证码到底是怎么生成的呢?
其实这是利用java的画板做的,需要一些随机数,然后画到画板上面。
可以使用JPanel的paint,也可以使用Canvas的paint 来实现。
但通常都是使用JPanel来实现,因为JPanel是Swing包的而且效率比较高。
下面分别展现一下这两种实现方式:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class IDCode extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
new IDCode();
}
public IDCode() {
super("验证码生成");
setBounds(300, 100, 300, 150);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
MyJPanel myJPanel = new MyJPanel();
panel.add(myJPanel,BorderLayout.CENTER);// 默认加在Center
JButton button = new JButton("看不清");
panel.add(button,BorderLayout.SOUTH);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
});
getContentPane().add(panel);
setVisible(true);
}
}
class MyJPanel extends JPanel {
private static final long serialVersionUID = 1L;
private Random random = new Random(System.currentTimeMillis());
@Override
public void paint(Graphics g) {
//所有的参数都需要根据实际情况来设定
g.setColor(Color.white);
g.fillRect(85, 20, 120, 50);
//画数字
g.setFont(new Font("黑体", Font.BOLD, 35));
for (int i = 0; i < 5; i++) {
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.drawString("" + random.nextInt(10), 95 + i * 19, 60 + random.nextInt(10));
}
//画干扰线
int count = 0;
while(count < 5){
int x1 = random.nextInt(120)+85;
int y1 = random.nextInt(50)+20;
int x2 = random.nextInt(120)+85;
int y2 = random.nextInt(50)+20;
if(Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))>80){
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.drawLine(x1, y1, x2, y2);
count++;
}
}
}
}
下面是Canvas的实现(部分代码):
class MyCanvas extends Canvas {
private static final long serialVersionUID = 1L;
private Random r = new Random(System.currentTimeMillis());
@Override
public void paint(Graphics g) {
// setBackground(Color.white);
g.setColor(Color.white);
g.fillRect(10, 10, 100, 50);
g.setFont(new Font("aa", Font.BOLD, 20));
for (int i = 0; i < 5; i++) {
g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
int a = r.nextInt(10);
int n = r.nextInt(10);
g.drawString("" + a, 50 + i * 10, 45 + n);
}
int i = 0;
while (i < 5) {
g.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
int x1 = r.nextInt(100);
int y1 = r.nextInt(60);
int x2 = r.nextInt(100);
int y2 = r.nextInt(60);
if (Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) < 50) {
continue;
}
g.drawLine(x1, y1, x2, y2);
i++;
}
}
}