【转】java中的绘图(二)
五.绘制椭圆
方法:drawOval(int x,int y,int width,int height)
功能:在指定的外接矩形中绘制一个圆形或椭圆。在这里椭圆的中心就是它外接矩形的中心,这个矩形的左上角坐标为(x,y),宽度和高度分别为width和height,即:
??? 参数x为x轴坐标
??? 参数y为y轴坐标
??? 参数width为矩形的宽度
??? 参数height为矩形的高度
??? 方法fillOval(int x,int y,int width,int height);作用是在指定的外接矩形中绘制一个圆形或椭圆,并使用当前图形对象的颜色对它进行填充。在这里椭圆的中心就是它外接矩形的中心,这个矩形的左上角坐标为(x,y),宽度和高度分别为width和height,即:
??? 参数x为x轴坐标
??? 参数y为y轴坐标
??? 参数width为矩形的宽度
??? 参数height为矩形的高度
?
例
??? ??????????import java.awt.*;
????????????? import java.applet.*;
????????????? public class mj1 extends Applet{
????????????????? public void init(){
????????????????????? resize(280,280);
???????????????????? }
?????????????????? public void paint(Graphics g){
??????????????????????? g.fillOval(20,20,90,90);
??????????????????????? g.drawOval(20,150,90,30);
??????????????????????? g.fillOval(140,20,70,200);
????????????????????? }
??????????????????? }??????
?
六.绘制弧形?????????????
?????????????????? ???
方法:drawArc(int x,int y,int width,int height,int startAngle,int arcAngle)
功能:在指定的外接矩形中绘制一个圆弧或椭圆弧。在这里圆弧或椭圆弧的中心就是它外接矩形的中心,这个矩形的左上角坐标为(x,y);宽度和高度分别为width和height,即:
??? 参数x为x轴坐标
??? 参数y为y轴坐标
??? 参数width为矩形的宽度
??? 参数height为矩形的高度
??? 参数startAngle为圆弧或椭圆弧的起始角度
??? 参数arcAngle为圆弧或椭圆弧跨越的角度
??? 参数startAngle和arcAngle的单位为 “度”,起始角的0度位置是3点钟的方位。如果arcAngle的值是正值,则表示从startAngle的角度开始,向逆时针方向画arcAngle度的弧;如果arcAngle的值是负值,则表示从startAngle的角度开始,向顺时针方向画arcAngle度的弧。
??? 方法fillArc(int x,int y,int width,int height,int startAngle,int arcAngle):其作用是在指定的外接矩形中绘制一个圆弧或椭圆弧,并使用当前图形对象的颜色对它进行填充。在这里圆弧或椭圆弧的中心就是它外接矩形的中心,这个矩形的左上角坐标为(x,y);宽度和高度分别为width和height,即:
??? 参数x为x轴坐标
??? 参数y为y轴坐标
??? 参数width为矩形的宽度
??? 参数height为矩形的高度
??? 参数startAngle为圆弧或椭圆弧的起始角度
??? 参数arcAngle为圆弧或椭圆弧跨越的角度
??? 参数startAngle和arcAngle的单位为 “度”,起始角的0度位置是3点钟的方位。如果arcAngle的值是正值,则表示从startAngle的角度开始,向逆时针方向画arcAngle度的弧;如果arcAngle的值是负值,则表示从startAngle的角度开始,向顺时针方向画arcAngle度的弧。
例
??? ???????import java.awt.*;
?????????? import java.applet.*;
?????????? public class mj1 extends Applet{
??????? ??????public void init(){
????????????????? resize(280,280);
???????????????? }
?????????????? public void paint(Graphics g){
?????????????????? g.setColor(Color.gray);
?????????????????? g.fillArc(30,20,90,90,0,180);
?????????????????? g.drawArc(30,150,90,90,45,135);
?????????????????? g.drawArc(150,20,50,80,225,300);
?????????????????? g.fillArc(140,150,70,100,45,90);
????????????????? }
????????????? }
???????
七 . 绘制多边形
方法: drawPolygon(int xPoints[],int yPoints[],int nPoints)
功能: 根据参数数组xPoints[]和yPoints[]提供的各个顶点坐标,绘制一个多边形。这个方法绘制的多边形包括nPoints个顶点,每条线从( xPoints[I-1], yPoints[I-1])到(xPoints[I], yPoints[I]),最后一条线从最后一个顶点开始到第一个顶点结束,其中:
??? 参数xPoints为多边形所有顶点的x轴坐标数组
??? 参数yPoints为多边形所有顶点的y轴坐标数组
??? 参数nPoints为顶点数目
方法fillPolygon(int xPoints[],int yPoints[],int nPoints);
功能: 根据参数数组xPoints[]和yPoints[]提供的各个顶点坐标,绘制一个多边形并使用当前图形对象的颜色对其进行填充。这个方法绘制的多边形包括nPoints个顶点,每条线从( xPoints[I-1], yPoints[I-1])到(xPoints[I], yPoints[I]),最后一条线从最后一个顶点开始到第一个顶点结束,其中:
??? 参数xPoints为多边形所有顶点的x轴坐标数组
??? 参数yPoints为多边形所有顶点的y轴坐标数组
??? 参数nPoints为顶点数目
??? 例: 我们绘制了一个八边形,第1个八边形我们用了9个顶点,即八边形的最后一条线是从最后一个顶点开始到第一个顶点结束的,所以我们看到的程序执行结果中的八边形是封闭的。在另一个八边形中我们用了8个顶点,即八边形的最后一条线是从倒数第2个顶点开始到最后一个顶点结束的,所以我们看到的程序执行结果中的八边形是不封闭的。
?????
?
????????????? import java.awt.*;
???????????? import java.applet.*;
???????????? public class mj1 extends Applet{
???????????????? public void init(){
???????????????????? resize(250,200);
??????????????????? }
???????????????? public void paint(Graphics g){
???????????????????? int Dx1[]={20,40,60,80,80,60,40,20,20};
???????????????????? int Dy1[]={30,10,10,30,50,70,70,50,30};
???????????????????? int Dd1=9;
???????????????????? int Dx2[]={20,40,60,80,80,60,40,20};
???????????????????? int Dy2[]={120,100,100,120,140,160,160,140};
???????????????????? int Dd2=8;
???????????????????? int Dx3[]={100,150,200,100};
???????????????????? int Dy3[]={50,10,50,50};
???????????????????? int Dd3=4;
???????????????????? int Dx4[]={100,150,200};
????????????????? ???int Dy4[]={140,90,140};
???????????????????? int Dd4=3;
???????????????????? g.setColor(Color.red);
???????????????????? g.fillPolygon(Dx1,Dy1,Dd1);
???????????????????? g.drawPolygon(Dx2,Dy2,Dd2);
???????????????????? g.fillPolygon(Dx3,Dy3,Dd3);
????? ???????????????g.drawPolygon(Dx4,Dy4,Dd4);
?????????????????? }
??????????????? }
??????????
八. 相互重叠的图形来
?
?? 方法: XORMode(Color c1)
? 功能: 绘制出相互重叠的图形,其中:
参数c1表示第2种颜色
?
?例:?? 程序中有4个不同颜色的图形,相互重叠。
?????? import java.awt.*;
????????? import java.applet.*;
????? ????public class mj1 extends Applet{
????????????? public void init(){
????????????????? resize(250,150);
??????????????? }
????????????? public void paint(Graphics g){
???????????????? int Dx1[]={30,50,70,90,90,70,50,30,30};
???????????????? int Dy1[]={40,20,20,40,60,80,80,60,40};
???????????????? int Dd1=9;
???????????????? int Dx2[]={100,150,200,100};
???????????????? int Dy2[]={50,10,50,50};
???????????????? int Dd2=4;
???????????????? g.setColor(Color.red);
???????????????? g.fillOval(130,40,40,40);
? ???????????????g.setXORMode(Color.green);
???????????????? g.drawPolygon(Dx2,Dy2,Dd2);
???????????????? g.setColor(Color.lightGray);
???????????????? g.fillPolygon(Dx1,Dy1,Dd1);
???????????????? g.setXORMode(Color.yellow);
???????????????? g.fillRect(15,10,220,80);
?????????????? }
???????????? }
九. 拷贝图形
?
方法: copyArea(int x,int y,int width,int height,int dx,int dy)
功能: 拷贝一个图形,这个方法的作用为拷贝一块屏幕上的矩形区域,该矩形区左上顶点坐标为(x,y),宽度为width,高度为height,该矩形区域被拷贝到坐标(x+dx,y+dy)处,
??? 参数x为源矩形区域的x轴坐标
??? 参数y为源矩形区域的y轴坐标
??? 参数width为宽度
??? 参数height为宽度
??? 参数dx为水平移动距离
??? 参数dy为垂直移动距离。
例.??
??????? ????import java.awt.*;
??????????? import java.applet.*;
??????????? public class mj1 extends Applet{
??????????????? public void init(){
??????????????????? resize(300,180);
??????????????? ???}
??????????????? public void paint(Graphics g){
??????????????????? int Dx1[]={100,150,200,100};
??????????????????? int Dy1[]={50,10,50,50};
??????????????????? int Dd1=4;
??????????????????? g.setColor(Color.green);
??????????????????? g.fillPolygon(Dx1,Dy1,Dd1);
??????????????????? g.copyArea(95,5,110,50,-60,70);
??????????????????? g.copyArea(95,5,110,50,60,70);
?????????????????? }
?????????????? }?
??????????
???????????????????? §4. 图像输出
???????????????????????
一. 加载图片文件
?
??? Java API在包java.awt、java.applet和java.image中都有对图形的支持。而目前Java中可以直接载入并输出的图形文件格式有两种。即:GIF和JPEG文件,所以我们只要给定图形文件的位置和文件名,就可以通过getImage这个方法载入所要的图形。getImage方法的格式为:
??? ①Image getImage( URL url );?
??? ②Image getImage( URL url, String name );????
??? 其中第①方式要给出图形文件的绝对URL地址,第②方式是要给出图形文件的基地址和图形文件名。如果图形文件和Applet在同一目录下时,用getCodeBase( )获取基地址,如果图形文件和包含Applet的HTML文件在同一目录下,则用getDocumentBase( ) 获取基地址。
?
二. 图片的显示输出
?
??? 输出图形要用到类Graphics,在Graphics类中用方法drawImage,可以把图形绘制出来,如果我们仅仅是简单地想要将图形显示出来,用g.drawImage(image1,x,y,this),其中:
??? 参数image1是类Image生成的对象
??? 参数x和参数y是图形出现的坐标点
??? 例1. ?import java.awt.*;
????????? import java.applet.*;
????????? public class xiaotiu extends Applet {
???????????????? Image pic1;
???????????????? public void init(){
????????????????????? resize(200,150);??????????????? ?
????????????? ????????pic1=getImage(getDocumentBase( ), "hlpglobe1.gif");
??????????????????? }
??????????????????? public void paint(Graphics g){
???????????????????????? g.drawImage(pic1,30,25,this);
?????????????????????? }
??????????????? }???
l???????? 如果用绝对位置来表示URL,必须根据文件位置和文件名称创建一个URL对象,再有getImage()方法载入图像文件。而创建URL对象时,URL够造方法可能会产生一个异常,必须对这个异常进行处理。
例2。:
import java.awt.*;
import java.applet.*;
import java.net.URL;
import java.net.MalformedURLException;
????????? public class mj1 extends Applet{
????????? Image pic1;
??????? ?????????public void init(){
?????????????????????????????????? ?try{
????????????????????????????????????????? ?URL url=new URL("file:///c:/mjj/tt8.gif");
?????????????????????????????????? ? pic1=getImage(url);
??????????????????? }
?????????????????????????????????? ?catch(MalformedURLException e){
????????????????????????????????????????? ?System.out.println("MalformedURLException:"+e);}
??????????????????????????? ?}
??????????????? ????public void paint(Graphics g){
???????????????????????? g.drawImage(pic1,30,25,this);
?????????????????????? }
??????????????? }
三.图形的缩放
方式: g.drawImage(image1,x,y,width,heigth,this)
功能:以不同的大小显示出图像
其中:width和heigth分别代表图像的宽和高。
?
例 3:????
?????????? import java.awt.*;
???????? import java.applet.*;
???????? public class xiaotiu extends Applet {
???????????????? Image pic1;
???????????????? public void init(){
????????????????????? pic1=getImage(getCodeBase ( ), "hlpglobe1.gif");
??????????????????? }
??? ????????????????public void paint(Graphics g){??
????????????????????????????????????????? ? g.drawImage(pic1,10,0,this);
???????????????????????? g.drawImage(pic1,10,100,100,100,this);
???????????????????????? g.drawImage(pic1,10,220,250,150,this);
?????????????????????? }
??????????????
十. 在一个图形中提取指定区域的图形
??? CropImageFilter, CropImageFilter是一个图像过滤器,它可以对图像进行修剪,主要用于提取指定矩形区域的图像。我们可以由此创建一个新的图形对象,也就是说通过这个方法,我们可以在一个图像中把我们需要的部分提取出来。方法: ?public CropImageFilter(int x,int y,int w,int h),其中:
?? 参数x表示被选取矩形左上角的x轴坐标
?? 参数y表示被选取矩形左上角的y轴坐标
?? 参数w为被选取矩形的宽度
?? 参数h为被选取矩形的高度
例4.
?
import java.awt.*;
import java.applet.*;
import java.awt.image.*;
import java.awt.event.*;
??? public class xiaotiu extends Applet implements MouseListener {
????? Image pic1,pic2;
?????? ? int x1,y1,w,h,count=1;
?????? ???? public void init(){
?????????? pic1=getImage(getCodeBase(),"联想标志.jpg");
????????????? ?? pic2=pic1;
????????????? ?? addMouseListener(this);
?????????????????? }
??????? public void paint(Graphics g){
?????? int w=pic2.getWidth(this);
?????? ?? int h=pic2.getHeight(this);
?????? ?? Dimension d=getSize();
?????? ?? if(w>d.width)w=d.width;
?????? ?? if(h>d.height)h=d.height;
?????? g.drawImage(pic2,(d.width-w)/2,(d.height-h)/2,this);
????????????? }
????????????? public void mouseClicked(MouseEvent e){}
????????????? public void mouseEntered(MouseEvent e){}
????????????? public void mouseExited(MouseEvent e){}????????
????????????? public void mousePressed(MouseEvent e){
??????????????????????????? ?int x;int y;??
???????????????? Graphics g=getGraphics();
??????????????????????????? ?x=e.getX();
??????????????????????????? ?y=e.getY();
??????????????????????????? ?? if(count==1){
?????????????????????????????????? ?? x1=x;y1=y;count=2;
?????????????????????????????????? ?? g.drawLine(x-5,y,x+5,y);
?????????????????????????????????? ?? g.drawLine(x,y-5,x,y+5);
??????????????????????????? ?? }else if(count==2){
?????????????????????????????????? ?? count=3;
?????????????????????????????????? ?? if(x1>x)w=x1-x;
?????????????????????????????????? ?? else w=x-x1;
?????????????????????????????????? ?? if(y1>y)h=y1-y;
?????????????????????????????????? ?? else h=y-y1;
?????????????????????????????????? ?? pic2=crop();
?????????????????????????????????? ?? repaint();
??????????????????????????? ?? }else{
?????????????????????????????????? ?? count=1;
?????????????????????????????????? ?? pic2=pic1;
?????????????????????????????????? ?? repaint();
??????????????????????????? ?? }
???????????????????? ?? }
????????????? public void mouseReleased(MouseEvent e){
????????????? }
????????????? Image crop(){
????????????? ImageFilter? filter =new CropImageFilter(x1,y1,w,h);
????????????? ?ImageProducer producer=new FilteredImageSource(pic1.getSource(),filter);
????????????? ?return createImage(producer);
????????????? }
??????????????? }???
?
l???????? 例播放声音:
Java提供两种在applet中播放声音的机制:Applet类的play方法和AudioClip中的play方法。
例1:
import java.awt.*;
import java.applet.*;
public class sheng extends Applet{
?public void paint(Graphics g){
??????? g.drawString("AudioTest",25,25);
??????? play(getDocumentBase(),"shengxin.au.au");
}
?????????? }
?
例2:
?import java.awt.*;
?import java.applet.*;
?public class shengxin extends Applet{
??? AudioClip sound;
??? public void init(){
??????? sound=getAudioClip(getDocumentBase(),"shengt1.au");}
??? public void paint(Graphics g){
?????????? Font ltz =new Font ("TimesRoman",Font.BOLD+Font.ITALIC,80);
?????????? g.setFont(ltz);
?????????? g.setColor(Color.red);
?????????? g.drawString("请听音乐",45,80);
?????????? g.setColor(Color.yellow);
?????????? g.drawString("请听音乐",47,82);
?????? }
?? public void start(){
??????????? sound.loop();
???????? }
? ?public? void stop(){
??? ????????sound.stop();
? ?}
}?