第11章 绘图于动画
§1. AWT对绘图的支持
Java为我们提供了一整套可用于窗口环境的程序包, 即AWT:Java.awt(Java Abstract Window Toolkit Package, Java抽象窗口工具包),就是使用于窗口环境的程序包。它提供了一套标准的图形用户界面(GUI)的元素,例如:按钮、列表、菜单、文本框等。它还包括容器(例如窗口和菜单条)和更高级的组件(例如用于打开和保存文件的对话框)等,Java.awt包是实现Java强大人机交互功能的有力工具。AWT包实际上由Java.awt.image(AWT image Package, AWT图形包)和Java.awt.peer(AWT peer package, AWT对等体包)两个包组成。前者提供了用于高级图形处理的类和接口,用于产生和处理图形与色彩的程序会经常用到该包;后者包含了一些接口,主要用于联系AWT组件与和它们系统相关的窗口实现。
一. 绘图过程
Component是一个抽象类,是许多AWT类的父类,它定义了在各种窗口对象中最基本,同时也是最重要的方法和性质。我们在使用AWT来设计程序的时候,如果要使窗口对象改变,如改变背景颜色、改变窗口对象的大小、重画窗口对象等等操作时,一般都是通过调用类Component中定义的方法来完成的。Component(组件)是AWT概念中,窗口系统所显示的各种对象的统称。每种组件都各有各的用处,例如我们经常在屏幕上用到的按钮(button)、列表框(List)等等, Component(Java.awt.Component)是代表这些组件的最基本的类。而除了菜单以外,所有代表窗口对象的类,都是类Component的子孙类。
l 在绘图过程中要用到Component类的方法:repaint()、update()、paint()
⑴方法: public void repaint()
功能: 重画当前组件。此方法将在尽可能短的时间里调用当前组件的update()。
⑵方法:public void update(Graphics g)
功能:更新当前组件
其中:参数g----图形对象
⑶方法:public void paint(Graphics g)
功能:重画当前组件
其中:参数g-----被重画的图新对象
l 在绘图过程中要用到applet类的方法:
⑴方法:public void resize(int width,int height)
功能:调整当前applet的大小。
其中:参数width----新的宽度、参数 height-----新的高度
⑵方法:public void init()
功能:此方法由浏览器或applet调用,用来通知applet已经被载入到系统中。对于继承类applet的子类,可以通过重写本方法使applet完成初始化工作,包括建立所需的对象、设置初始状态、装载图形或者字体、设置参数等。
§2. 文本处理
一.坐标系统
和计算机上其他的编程语言和绘图程序一样,在绘图的平面区域上我们想象有一个二维坐标,通过它就可以把绘图和写字位置表示清楚。在Java中坐标原点 (0,0)位于整个绘图平面的左上角,从原点 (0,0)出发向右为x轴,向下为y轴。所有的坐标都必须是正整数,不能带有小数,一个单位代表一个像素。所以要把一个图像或字放在屏幕的一个指定位置,只要指定出它的x和y坐标就可以了。
二.字形的设置和改变
在Java字型设置中类Font是很重要的。如果要在Java小应用程序上输出文字,在我们要确定显示的字型时,就要用到类Font来决定显示文字时的字型。
1.字型的设置
要产生类Font的对象实体,其使用的构造方法是:
publuc Font(String fontName,int style,int size) 。
其中:参数fontName表示所要选的字体的名称,例如英文的有:“TimesRoman”、 “Courier”等等,中文的有:“宋体”等等;
参数style为字体的表现形式,有正常字体(PLAIN)、粗体(BOLD)等等;
参数size是用来指定字体的大小的。
功能:根据参数提供的字体名称、形式、字体大小创建一个新的字体对象。
2.显示字形改变字型
显示方法可以用Graphics类中的下列方法:
⑴ 方法drawString(String str,int x,int y);此方法使用当前图形对象的字体和颜色输出字符串str,其中
参数str表示被输出的字符串
参数x表示x轴坐标
参数y表示y轴坐标
⑵drawChars(char data[],int offset,int length, int x,int y);这种方法使用当前图形对象的字体和颜色输出字符数组data[]中的指定部分。其中:
参数data表示被输出的字符数组
参数offset表示起始下标
参数length表示输出字节数
参数x表示x轴坐标
参数y表示y轴坐标
⑶drawBytes(byte data[],int offset,int length, int x,int y);这种方法使用当前图形对象的字体和颜色输出字节数组data中的指定部分。其中:
参数data表示被输出的字节数组
参数offset表示起始下标
参数length表示输出字节数
参数x表示x轴坐标
参数y表示y轴坐标
⑷setFont(Font font);设置图形对象的当前字体为参数指定的字体font。
参数font -----字体
⑸getFont(); 返回当前图形对象的字体。
例10.1
import java.awt.*;
import java.applet.*;
import java.awt.Font;
public class mj1 extends Applet{
Font zt1=new Font ("TimesRoman",Font.PLAIN,20);
Font zt2=new Font ("TimesRoman",Font.BOLD,30);
Font zt3=new Font ("TimesRoman",Font.ITALIC,40);
Font zt4=new Font ("TimesRoman",Font.BOLD+Font.ITALIC,40);
Font zt5=new Font ("Courier",Font.PLAIN,50);
String pmz1="Java FAQ";
public void paint (Graphics g){
g.setFont (zt1);
g.drawString (pmz1,10,20);
g.setFont (zt2);
g.drawString (pmz1,10,55);
g.setFont (zt3);
g.drawString (pmz1,10,110);
g.setFont (zt4);
g.drawString (pmz1,10,170);
g.setFont (zt5);
g.drawString (pmz1,10,230);
}
}
三.颜色的设置
用Color类,在Java中Color类将颜色按照RGB格式进行封装。RGB格式中,红蓝绿三原色的取值范围都是0~255。若某种颜色取值为0,则表示该颜色不起任何作用;若取值为255,则表示起最大作用。如果将三种颜色进行叠加就可以生成一种新的颜色,合成的RGB颜色的值为“000000”表示黑色,“ffffff”表示白色。首先调用Color的构造函数,产生一个Color对象,再用Graphics类里的setColor把它设置到Graphics对象上。
方法:setColor(Color c)
功能:设置图形对象的颜色为参数所指定的颜色
Color类的构造方法:
Color(int,int,int);
功能:根据指定0~255之间的红、绿、蓝(RGB)的值生成新的颜色。这样我们就可以创造出自己想要的颜色。Color中已经定义好的各种颜色常数我们也可以方便地直接使用:
red 红 green 绿 blue 蓝 white 白 black 黑 yellow 黄
pink 粉 cyan 青 orange 橙 gray 灰 darkGray 深灰 lightGray 浅灰
例10.2
import java.awt.*;
import java.awt.Font;
import java.applet.*;
public class mj1 extends Applet
{
Font zt1=new Font ("TimesRoman",Font.PLAIN,20);
Font zt2=new Font ("TimesRoman",Font.BOLD,30);
Font zt3=new Font ("TimesRoman",Font.ITALIC,40);
Font zt4=new Font ("TimesRoman",Font.BOLD+Font.ITALIC,40);
Font zt5=new Font ("Courier",Font.PLAIN,50);
String pmz1="Java FAQ";
public void paint (Graphics g)
{
g.setColor(Color.orange);
g.setFont (zt1);
g.drawString (pmz1,10,20);
g.setFont (zt2);
g.drawString (pmz1,10,55);
g.setColor(Color.red);
g.setFont (zt3);
g.drawString (pmz1,10,110);
g.setFont (zt4);
g.drawString (pmz1,10,170);
g.setColor(Color.blue);
g.setFont (zt5);
g.drawString (pmz1,10,230);
}
}
例10.3 利用两种反差比较大的颜色,使字体看起来具有立体感。
import java.awt.*;
import java.awt.Font;
import java.applet.*;
public class mj1 extends java.applet.Applet{
public void init(){
resize(300,150);
}
public void paint (Graphics g){
Font ltz =new Font ("TimesRoman",Font.BOLD+Font.ITALIC,40);
g.setFont(ltz);
g.setColor(Color.red);
g.drawString("Java FAQ",45,80);
g.setColor(Color.yellow);
g.drawString("Java FAQ",47,77);
}
}
§3.制作几何图形
Graphics类提供多种几何图形功能, 通过它的方法可以实现画线、几何图形等。
一. 画线
方法: drawLine(int x1, y1,int x2,int y2),
功能:在(x1,y1)和(x2,y2)这两个坐标之间画出一条直线,其中:
参数x1表示第1个点的x轴坐标
参数y1表示第1个点y轴坐标
参数x2表示第2个点x轴坐标
参数y2表示第2个点y轴坐标
例1.
import java.awt.Graphics;
import java.applet.*;
public class mj1 extends Applet{
public void paint(Graphics g){
g.drawLine(20,30,150,100);
g.drawLine(150,50,10,100);
g.drawLine(10,130,190,130);
}
}
二.绘制普通矩形
Java提供了3种矩形的绘制方式,我们先看普通型:
darwRect(int x,int y,int width,int height),它的功能是画出一个矩形,其中:
参数 x代表矩形左上角的x坐标
参数y代表矩形左上角的y坐标
参数width表示矩形的宽度
参数height表示矩形的长高度
例2.
import java.awt.*;
import java.awt.Font;
import java.applet.*;
public class mj1 extends Applet{
Font zt4=new Font ("宋体",Font.BOLD,20);
String pmz4="矩形";
public void paint (Graphics g){
g.drawRect(20,20,150,100);
g.setColor(Color.red);
g.setFont (zt4);
g.drawString (pmz4,45,50);
}
}
方法:fillRect(int x,int y,int width,int height),
功能:使用当前图形对象的颜色填充参数指定的矩形,其中:
参数x为x轴坐标
参数y为y轴坐标
参数width为矩形的宽度
参数height为矩形的高度
例3.
import java.awt.*;
import java.awt.Font;
import java.applet.*;
public class mj1 extends Applet{
Font zt4=new Font ("TimesRoman",Font.BOLD,20);
String pmz4="Java FAQ";
public void paint (Graphics g){
g.setColor(Color.lightGray);
g.fillRect(20,20,150,100);
g.setColor(Color.red);
g.setFont (zt4);
g.drawString (pmz4,45,50);
}
}
三.绘制立体矩形
方法:draw3DRect(int x,int y,int width,int height,boolean raised);和fill3DRect(int x,int y,int width,int height,boolean raised);
方法draw3DRect(int x,int y,int width,int height,boolean raised):其作用为绘制一个突出的三维立体矩形,其中:
参数x为x轴坐标
参数y为y轴坐标
参数width为矩形的宽度
参数height为矩形的高度
参数raised表示立体矩形的状态,raised为true,则立体矩形为凸起状态;raised为false,则立体矩形为凹下状态。
方法draw3DRect(int x,int y,int width,int height,boolean raised);其作用为绘制一个突出的三维立体矩形并使用当前图形对象的颜色对其进行填充,其中:
参数x为x轴坐标
参数y为y轴坐标
参数width为矩形的宽度
参数height为矩形的高度
参数raised表示立体矩形的状态,raised为true,则立体矩形为凸起状态;raised为false,则立体矩形为凹下状态。
例4.
import java.awt.*;
import java.awt.Font;
import java.applet.*;
public class mj1 extends Applet{
public void init(){
resize(350,260);
}
public void paint (Graphics g){
g.setColor(Color.lightGray);
g.fill3DRect(20,20,150,100,true);
g.fill3DRect(180,20,150,100,false);
g.draw3DRect(20,140,150,100,true);
g.draw3DRect(180,140,150,100,false);
}
}
四.绘制圆角矩形
方法:drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight)和fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight)。
方法drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight)其作用为绘制一个圆角矩形,其中:
参数x为x轴坐标
参数y为y轴坐标
参数width为矩形的宽度
参数height为矩形的高度
参数arcWidth为圆弧的横向直径
参数arcHeight为圆弧的纵向直径
方法fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight)其作用为绘制一个圆角矩形并使用当前图形对象的颜色对其进行填充,其中:
参数x为x轴坐标
参数y为y轴坐标
参数width为矩形的宽度
参数height为矩形的高度
参数arcWidth为圆弧的横向直径
参数arcHeight为圆弧的纵向直径
例:
import java.awt.*;
import java.awt.Font;
import java.applet.*;
public class mj1 extends Applet{
public void init() {
resize(480,280);
}
public void paint (Graphics g){
g.setColor(Color.gray);
g.fillRoundRect(20,20,100,80,40,40);
g.drawRoundRect(180,20,100,80,80,80);
g.fillRoundRect(350,50,80,20,70,70);
g.drawRoundRect(25,140,80,80,80,80);
g.fillRoundRect(160,140,130,60,50,50);
g.drawRoundRect(350,130,70,120,50,10);
}
}