欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

教程  Java语言学习—第十九章 Java2D 图形[Java基础]

Java 原创 1148 0评论

内容概要:

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

赞 (2) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽