内容概要:
1.在组件上作图
2.绘制图形
3.绘制图像
4.Graphics2D类及几何图形
5.双缓冲
1.在组件上作图
组件的paint()方法是个组件绘制自身时调用的方法。当组件要重新绘制自身时,此方法会被自动调用。paint()方法的方法头定义如下:
public void paint(Graphics g)
Graphics的对象被作为参数传递给paint()方法,它通常被称为图形上下文(graphic context)。当需要重画组件的一部分时,就可以使用Graphics对象,程序人员只需覆盖paint()方法,调用相应的方法在组件上绘制想要的图像即可。
Paint()方法只会在需要时被自动调用。但是,有时即使未被遮盖,也需要对画面进行更新。此时,只需要调用repaint()方法即可。调用repaint()方法将引发对update()方法的调用。
update()方法首先会清除背景,然后设置背景,再调用paint()方法完成组件的具体绘图操作:
repaint()→update()→paint()
即使不覆盖Paint()方法,也有其他方法用以完成在组建中绘图的,这就是使用Component类的getGraphics()方法,此方法返回组件Graphics对象的引用。注意在组件未显示时,调用getGraphics()方法会导致返回null值。
public Graphics getGraphics()//获取组件的Graphics对象
2.绘制图形
Graphics类提供了各种绘制图形的方法,由于Graphics类的大部分方法都是抽象的方法,所以表示上的方便,我们在下面所列出的方法中都省略了abstract关键字。
Graphics类的常用方法:
public void drawLine(int x1,int y1,int x2,int y2)——在(x1,y1)与(x2,y2)之间画一条线。
public void drawRect(int x,int y,int width,int height)——绘制平面矩形。x,y为矩形左上角顶点坐标;width为矩形的宽度,height为矩形的高度。
public void drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight)——绘制圆角矩形。x,y为矩形的外接矩形(由圆角矩形四条边延长相交而得)的左上角的定点坐标;width,height为宽度和高度;arcWidth为圆角的弧度,arcHeight为圆角的弧高。图示如下:
public void drawOver(int x,int y,int width,int height)——绘制椭圆。x,y是外切矩形左上角的顶点坐标;width,height为椭圆的宽度与高度。
public void drawArc(int x,int y,int width,int height,int startAngle,int arcAngle)——绘制弧。前四个参数含义与椭圆中相同,startAngle为起始角度,arcAngle为弧角度。
public void drawPolygon(int xPoints[],int yPoints[],int nPoints)——绘制多边形,数组xPoints与yPoints为多边形顶点(x,y)的集合,nPoints是多边形顶点个数,与数组长度一致。
public void drawPolygon(Polygon p)——绘制一个有指定多边形p定义的多边形,Polygon是一个多边形类。
public void drawPolyline(int xPoints[],int yPoints[],int nPoints)——绘制由执行连接而成的取消。数组xPoints与yPoints为节点(x,y)的集合,nPoints为节点的个数。
public void clearRect(int x,int y,int width,int height)——清除矩形区域。x,y为矩形 左上角的顶点坐标,width为矩形的宽度,height为矩形的高度。
public void fillRect(int x,int y,int width,int height)——绘制填充图形
public void fillOver(int x,int y,int width,int height)——绘制填充椭圆
3.绘制图像
用于绘制图像的类
类 作用
Graphics 绘制图像
Image 代表图像本身
URL 代表图像的位置
Toolkit 调入图像
MediaTracker 跟踪图像状态
Graphics类
Graphics类通过了drawImage()方法,用于绘制整个图像(扩大或缩小)或图像的部分区域。drawImage()方法接收ImageObserver对象作为参数,ImageObserver用于存储图像信息并更新图像,当图像未完全载入时,调用drawImage()方法就会有消息传给ImageObserver对象,它会一直观察至图像完全载入。所以绘制图像视为实现了ImageObserver接口。
Graphics类的常用方法
drawImage(Image img,int x,int y,ImageObserver observer);——显示图像,顺利显示时返回true,否则返回false。其中参数img为被显示的图像,(x,y)为图像左角图标,observer可设为放置图像的位置。
public abstract boolean drawImage(Image img,int x,int y,Color bgcolor,ImageObserver observer);——各参数含义同上,bgcolor为图像背景色。
public abstract boolean drawImage(Image img,int x,int y,int width,int height,ImageObserver observer);——以指定的高度与宽度显示图像。
public abstract boolean drawImage(Image img,int x,int y,int width,int height,Color bgcolor,ImageObserver observer);——在指定位置,使用指定的宽度与高度及背景色,显示图像。
public abstract boolean drawImage(Image img,int dx1,int dy1,int dx2,int dy2,int sx1,int sy1,int sx2,int sy2,ImageObserver observer);——将图像img的指定位置(sx1,sy1,sx2,sy2)绘制在另一个区域(dx1,dy1,dx2,dy2)中。若这两个区域的大小不同,则可实现图像的扩大与缩小。
public abstract boolean drawImage(Image img,int dx1,int dy1,int dx2,int dy2,int sx1,int sy1,int sx2,int sy2,Color bgcolor,ImageObserver observer);——个参数含义同上。bgcolor用于设置图像的背景色。
Image类
Image类是一个抽象类,用来保存二进制的图像数据。不能使用new关键字来创建该图像。但是,可通过Toolkit对象的getImage()方法取得图像并赋给所声明的图像引用变量。
Tookit toolkit=Toolkit.getDefaultToolkit(); //获取缺省的工具集对象
Image img=toolkit.getImage(URL对象);//获取图像
并且也可以使用Component组件类的createImage()方法创建新的图像。
Image img=组件.createImage(100,200);//创建宽度为100,高度为200的图像对象
如此创建的图像也可以被使用在双缓冲(double buffering)中。Toolkit类及双缓冲稍后将详细介绍。
Image类的常用方法
public abstract Graphics getGraphics();——获取图像的Graphics对象。修改图像时使用。
public abstract int getWidth(ImageObserver observer);——获取图像的宽度。
public abstract int geHeight(ImageObserver observer);——获取图像的高度。
URL类
URL类表示万维网URL(Uniform Resource Locator)。URL的构成如下:
服务器类:http,ftp
服务器的位置:java.sun.com
文件名:index.html,image.gif
URL url=new URL(“图片位置”);
利用某个类的相对路径,也可以或得URL对象。
//获取对象的Runtime类的对象:Class cl=对象.getClass();
//获取与类位于同一位置的文件的URL对象:URL url=cl.getResource(文件名);
ToolKit类
ToolKit类用于载入图像或提供有关画面的信息,常用方法如下:
public static synchronized Toolkit getDefaultToolkit();——获取缺省的ToolKit对象。
public abstract Image getImage(String filename);——获取Filename指定的对象。
public abstract Iamge getImage(URL url);——获取URL所对应的图像。
public abstract boolean prepareImage(Image img,int width,int height,ImageObserver observer);——准备绘制高度(height)与宽度(width)的图像。若向width和height代入-1,以图像的大小做准备。
public abstract Dimension(getScreemSize();——获取屏幕的尺寸
getImage()方法只是生成了图像的位置(URL),并不会载入图像,只有调动了Graphic对象的drwaImae()方法,程序才会载入图像并控制它。调用drawImage()方法不会导致图像立即被绘制。还需另外调用prepareImage()方法,使程序开始载入图像,若图像进入可绘制状态,返回true。
Frame f=new Frame(); Gtaphics g=f.getToolkit();.....................//获取Frame的Graphic对象 Toolkit toolkit=f.getToolkit(); .....................//获取Frame的Toolkit对象 Image img=toolkit.getImage(URL对象);.....................//获取图像 toolkit.prepareImage(img,-1.-1.f);.....................//是img进入可绘制状态 g.drawImage(img,10,10,f);.....................//绘制img
MediaTracker类
MediaTracker类用于跟踪图像的状态,试用起来相当方便。MediaTracker类拥有一个列表,用于添加或删除加载的图像。添加图像时,图像的Id会被一起添加进去,图像的Id可以重复,具有相同的id的图像被放在一起处理。
MediaTracker类常用构造函数
public MediaTracker(Component comp);——创建一个MediaTracer对象,可以跟踪即将在指定的组件comp中绘制的图像。
MediaTracker类的常用方法
public void addImage(Image image,int id);
public void addImage(Image image,int id,int w,int h);
——将具有id的image添加至列表中,w(宽度)与h(高度)用来调整图像的倍率.Id号可重复。
public void removeImage(Image image);
public void removeImage(Image image,int id);
public void removeImage(Image image,int id,int width,int height);
——从列表中删除图像
public boolean checkAll();——若所有图像都已被加载完毕,则返回true,否则返回false。
public boolean checkID(int id);
public boolean checkID(int id,boolean load);
——检查具有id的图像,若load为true,则开始加载尚未被加载的图像。
public synchronized Object[] getErrorAny();
public synchronized Object[] getEooroID(int id);
——返回所有出现错误的图像或返回具有指定id的图像。
public synchronized boolean isErrorAny();
public synchronized boolean isEooroID(int id);
——图像加载期间,若出现错误返回true,否则返回false。
pubilc void waitForAll() throws InterruptedException;
pubilc boolean waitForAll(long ms) throws InterruptedException;
——等待直至所有图像被加载或等待ms毫秒。若中间出现错误,也会被看做被加载了,所有,要使用isErrorAny()方法检查错误。
pubilc void waitForID(int id) throws InterruptedException;
pubilc boolean waitForID(int id,long ms) throws InterruptedException;
——等待直至所有图像被加载或等待ms毫秒。若中间出现错误,也会全部被看做加载。
4.Graphics2D类及几何图形
Graphics2D类
Graphics2D类继承了Graphics,它对于2D Graphics环境有强有力的支持。AWT组件的paint(Graphics g)方法的参数所接收的Graphics对象可以转换成Graphics2D的对象。
public void paint(Graphics g){
Graphics2D g2=(Graphics 2D)g;
}
事实上,组件上的图片并非是Graphics对象,而是一个Graphics2D对象,所以类型转换是不可缺少的。
几何图像
java.awt.geom包含了几何图形类。其中所有类都实现了Shape图形接口。实现了Shape图形接口的类有Line2D,Rectangle2D,Fllipse2D,GeneralPath等。
Shape接口的常用方法
public boolean contains(double x,double y);——若点(x,y)位于图形内部,则返回true;否则,返回false。
public boolean contains(double x,double y,double w,double h);——若区域(x,y,w,h)位于图形内部,则返回true;否则,返回false。
public Rectangle getBounds();
public Rectangle2D geBounds2D();
——返回包围图像的矩形区域
public boolean intersects(double x,double y,double w,double h);
public boolean intersects(Rectangle2D r);
——若指定的区域与图形重叠,则返回true;否则返回false。
Graphics2D的常用方法
public abstract void draw(Shape s);——绘制图形外部轮廓
public abstract void fill(Shape s);——绘制填充图形。
Rectang2D类及Ellipse2D类
Rectangle2D类是一个抽象类,表示平面上的矩形。有两个子类:Rectangle2D.Double和Rectangle2D.Float类,分别用双精度坐标与浮点坐标。其构造函数需要4个参数,分别是左上角的定点坐标x,y和矩形的高宽度。
Graphics2D g2=(Graphics2D)g;
Rectangle2D rect=new Rectangle2D.Double(10.0,30.0,200.0,100.0);
g2.draw(rect);
Ellipse2D类也是一个抽象类,它用来表示平面上的椭圆。构造函数需要4个参数,分别为外切矩形的左上角坐标x,y及高宽度。高宽度相等时表示一个圆。
Graphics2D g2=(Graphics2D)g;
Ellipse2D ellipse=new Ellipse2D.Double(10.0,30.0,200.0,100.0);
g2.draw(rect);
GreneralPath类实现了有志向或曲线相互连接形成的图像。
GeneralPath类的常用方法
public synchronized void moveTo(float x,float y); ——将当前点移动到(x,y)。
public synchronized void lineTo(float x,float y);——在当前点与(x,y)之间做一条直线。
public void append(Shape s,boolean connect);——添加新图像,若参数connect为true则添加的新图像与当前图像进行连线。
public synchronized void closePath();——在起点与终点之间绘制一直线,然后关闭路径。
渲染属性
2D图像环境对线的粗细和类型、颜色等,坐标变化都有支持。我们称为渲染属性(Rendering Attributes),它具体分为Stroke,Paint,Composite,Transform,Clip,RenderingHints等属性。
Stroke属性
Stroke属性决定图形轮廓的样式。BasicStroke类实现了Stroke属性,其对象可用来设定线条粗细、终点样式及交点样式。
BasicStroke的常数
public final static int CAP_BUTT=0;——将线段终点矩形化。
public final static int CAP_ROUND=1;——将线段终点圆形化。
public final static int CAP_SQUARE=2;——外观与使用常数CAP_BUTT所呈现的外观一样。
public final static int JOIN_MITER=0;——锐化交点样式。
public final static int JOIN_MITER=1;——圆化交点样式。
public final static int JOIN_MITER=2;——钝化交点样式。
BasicStroke的常用构造函数
public BasicSrtoke(float width,int cap,int join,float miterlimit,float dash[],float dash_phase)
——用指定的width(线的粗细),cap(结点样式)、join(顶点样式),miterlimit(顶点个数限制:大于1的值)、dash(虚线类型)、dash_phase(虚线中两点之间)创建Stroke对象。
public BasicStroke(float width,int cap,int join,float miterlimit)——与BasicStroke(width,cap,join,miterlimit,null,0.0f)一样。若dash为null,dash_phase为0,此为实线。
public BasicStroke(float width,int cap,int join)——与BasicStroke(width,cap,join,miterlimit,10.0f,null,0.0f)表示的含义一样。
public BasicStroke(float width)——与BasicStroke(width,cap_SQUARE,join_MITER,miterlimit,10.0f,null,0.0f)表示的含义一样。
public BasicStroke()—— 与BasicStroke(width,cap_SQUARE,join_MITER,miterlimit,10.0f,null,0.0f)表示的含义一样。
Paint属性
Paint属性在填充图形时使用,有单色属性、渐变属性与title属性之分。
GradienPaint:使用线形渐变填充图形(渐变效果)
TextturePaint:反复使用小图像填充图形(花砖效果)
若想使用Paint属性,需调用Graphics2D对象的setPaint()方法。若想使用单色填充,方法如下:g2.setPaint(Color.red);
GradienPaint类的常用构造函数
public GradientPaint(float x1,float y1,Color color2,,float x2,float y2,Color color2)——创建一个由起点(x1,y1)、颜色(Color1)到终点(x2,y2),颜色(color2)变化的Paint对象。
public GradientPaint(float x1,float y1,Color color2,,float x2,float y2,Color color2,boolean cyclic)——参数含义同上,Cyclic为true,则反复应用渐变效果。
创建GradientPaint对象,并应用于Graphics2D对象代码如下:
g2.setPaint(new GradientPaint(0,0,Color.white,50,50,Color.blue,true));
BufferedImage的构造函数
public BufferedImage(int width,int height,int imageType)——使用指定的imageType大小,创建BufferedImage对象。
imageType表示一张图片所占的比特数及RGB信息,它被定义成常数。如TYPE_INT_RGB表示一张图片占4个字节,并且RGB分别占8比特的图像类型。
TexturePaint类的构造函数
public TexturePaint(BufferedImage txtr,Rectangle2D anchor)——创建一个将txtr映射至anchor的TexturePaint对象。
Composite属性
Composite(合成)属性用于图像相重叠时调和色相。AlphaComposite实现了Composite。
若想创建AlphaComposite对象,则必须使用静态方法getInstance()方法。
pubilc static AlphaComposite getInstance(int rule,float alpha)
获取AlphaComposite对象。Rule为颜色的合成规则,alpha为颜色的透明度(在0.0f与1.0f之间)
合成规则CLEAR,SRC_IN,SRC_OVER等。若使用常用的SRC_OVER进行合成,则绘制图像呈现半透明状态。透明度为0.0f时,图像完全透明;透明度为1.0f时,呈现完全不透明状态。
我们可以用Graphics2D对象的setComposite()方法,,设定要应用的Composite属性。
AlphaComposite alpha;
alpha=AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.3f);
g2.setComposite(alpha);
Transform属性
java2D提供基本接口用于坐标自由转换。java.awt.geom包中的AffineTransform类用于实现坐标平移、旋转、缩放、反转及变形坐标变化。坐标变化是指3X3形式表现的坐标与坐标(x,y)相乘而得到坐标(x’,y‘)。
AffineTransform类的常用方法
public AffineTransform()——创建基本的AffineTransform对象。
public AffineTransform(double m00,double10,doublem01,double m11,double m02,double m12)——使用形式参数指定的变化阵列,创建AffineTransform对象。
public AffineTransform(float[] flatmatrix)
public AffineTransform(double[] flatmatrix)——使用指定的数组(数组各元素分别表示m00,m10,m01,m11,m02,m12),创建AffineTransform对象。
调用setTransform()方法,可以将AffineTransform对应用于Graphics2D中。
AffineTransform affine=new AffineTransform(。。。);
...
g2。setTransform(affine);
Graphics2D类的常用方法
public abstract void translate(double tx,double ty);——将坐标向x轴方向平行移动tx,向y轴平移ty。
public abstract void rotate(double theta);——以圆心为中心,旋转theta度。角度的单位为弧度。
public abstract void scale(double sx,double sy);——将坐标沿x轴方向变化(放大或缩小)sx,沿y轴方向变化(放大或缩小)sy。
public abstract void shear(double shx,double shy);——将坐标沿x轴缩减shx,沿y轴缩减shy。
Clip属性
Clip指绘图区域,一旦被指定,Clip区域之外的区域就无法进行绘图。若想只在某个区域绘图,必须指定Clip区域。Clip区域不仅可以是矩形,也可以是实现Shape接口的任意图形。
Graphics类的常用方法
public abstract Rectangle getClipBounds();——当paint()方法被调用时,获取新的绘图区域。
public abstract void setClip(int x,int y,int width, int height);——将矩形[x,y,width,height]设置为Clip区域。
public abstract void setClip(Shape clip);——将图形Clip指定为Clip区域。
public abstract Shape getClip();——获取Clip区域(以Shape类型返回)。
public boolean hitClip(int x,int y,int width, int height);——若[x,y,width,height]与当前Clip区域重叠,返回true;否则返回false。
5.双缓冲
此处所说的双缓冲被实现为Image类的对象。我们在创建Image类对象后,再获取Image对象的Graphics对象,进行绘制操作即可。此时,缓冲区大小与组件的大小必须一致。
Image buffer=组件.createImage(width,height);//创建buffer
Graphics g=buffer.getGraphics();//获取buffer的Graphics对象
g.drawImage(...);...向Buffer绘制图像
...drawImage(buff,0,0...); //向组件绘制Buffer中的图像。
问题思考
转载请注明: ITTXX.CN--分享互联网 » Java语言学习—第十九章 Java2D 图形[Java基础]
最后更新:2018-10-15 16:10:39