很多GUI程序都需要在组件上绘制图形,比如实现一个五子棋小游戏就需要在组件上绘制棋盘和棋子。在java.awt包中专门提供了一个Graphics类,它相当于一个抽象的画笔,其中其中提供了各种绘制图形的方法,使用Graphics类的方法就可以完成在组件上绘制图形。下面为Graphics的常用方法:
方法声明 | 方法描述 |
void setColor(Color c) | 将此图形上下文的当前颜色设置成指定颜色 |
void setFont(Font f) | 将此图形上下文的当前文字设置成指定文字 |
void drawLine(int x1,int y1,int x2,int y2) | 以(x1,y1)和(x2,y2)为端点绘制一条直线 |
void drawRect(int x,int y,int width,int height) | 绘制指定的矩形。矩形的左边缘和右边缘分别位于x,x+width,举行的上边缘和下边缘分别位于y,y+height |
void drawOval(int x,int y,int width,int height) | 绘制指定的椭圆,它恰好能放进一个由x,y,width,height参数指定的矩形中,椭圆覆盖的区域宽度为width+1,长度为height+1 |
void fillRect(int x,int y,int width,int height) | 用当前颜色填充指定矩形,该矩形左边缘和右边缘分别位于x,x+width-1,上边缘和下边缘分别位于y,y+height-1 |
void fillOval(int x,int y,int width,int height) | 用当前颜色填充指定椭圆,该椭圆左边缘和右边缘分别位于x,x+width-1,上边缘和下边缘分别位于y,y+height-1 |
void drawString(String str,int x,int y) | 使用此图形上下文的颜色填充指定的文本str,最左侧字符左下角位于(x,y)坐标 |
下面是一个图片验证码的例子,代码如下:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class Main{
public static void main(String[] args)throws Exception{
final Frame f=new Frame("验证码");
f.addWindowListener(new WindowAdapter(){//为窗口注册监听器,实现窗口关闭功能
public void windowClosing(WindowEvent e){
f.dispose();
}
});
final Panel p=new MyPanel();
f.add(p);
f.setSize(200, 100);
f.setLocationRelativeTo(null);//将窗口f居中
f.setVisible(true);
}
}
class MyPanel extends Panel{
public void paint(Graphics g){
int width=160;
int height=40;
g.setColor(Color.LIGHT_GRAY); //设置上下文颜色
g.fillRect(0, 0, width, height); //填充背景颜色
g.setColor(Color.black); //设置上下文颜色
g.drawRect(0, 0, width-1, height-1);//绘制边框
//绘制干扰点
Random r=new Random();
for(int i=0;i<100;i++){
int x=r.nextInt(width)-2;
int y=r.nextInt(height)-2;
g.drawOval(x, y, 2, 2);
}
g.setFont(new Font("黑体",Font.BOLD,30));
g.setColor(Color.BLUE);
//产生随机数字
char[] chars=("0123456789zxcvbnmasdfghjklpoiuytrewq"+"ZXCVBNMKJLHGFDSAQWERTYUIOP").toCharArray();
StringBuilder sb=new StringBuilder();
for(int i=0;i<4;i++){
int pos=r.nextInt(chars.length);
char c=chars[pos];
sb.append(c+" ");
}
//写入随机验证码
g.drawString(sb.toString(), 20, 30);
}
}