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); } }