抽象窗口化工具(AWT)为图形用户界面编程提供API编程接口,使得Java可以提供较好的图形用户界面。

AWT把图形处理分为两个层次:一是处理原始图形,这一层较原始,图形直接以点、线和面的形式画到界面上;二是提供大量组件,实现可定制的图形用户界面。

1  Paint方法、Update方法和Repaint方法

1) Paint方法

public void paint(Graphics g)

以画布为参数,在画布上执行画图方法。在Applet中,不显式地调用paint方法。

2) Repaint方法

Applet重画时系统自动调用paint方法。

3) Update方法

public void update(Graphics g)

更新容器,向Repaint发出刷新小应用程序的信号,缺省的Update方法清除Applet画图区并调用Paint方法。

2 Graphics类

Graphics类是所有图形上下文的抽象基类,允许应用程序在各种设备上实现组件的画图。图形对象封装了Java支持的基本渲染操作的状态信息,包括画图的组件对象、渲染区域的坐标(coordinates)、区域(clip)、颜色(color)、字体(font)、画图模式等。Graphics类提供画各种图形的方法,其中包括线、圆和椭圆、矩形和多边形、图像以及各种字体的文本等。这些方法具体如下:

public abstract void clipRect(int x, int y, int width, int height)                 指定的区域切分。

Paint颜料属性决定线条绘制的颜色。 Font字体。Stroke 画笔属性确定线型,如实线、虚线或点划线。 Transform转换属性定义渲染过程中应用的转换方法,使绘制的图形平移、旋转和缩放。

Composite 合成属性决定如何在组件上绘制叠放图形。Clip剪切属性定义组件上的一个区域边界。

public abstract void drawLine(int x1, int y1, int x2, int y2)                      使用当前颜色,在点(x1, y1) 和 (x2, y2) 之间画线。

public abstract void drawOval(int x, int y, int width, int height)                  画椭圆。

public abstract void fillOval(int x, int y, int width, int height)                    画实心椭圆。

public abstract void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)          画x和y坐标定义的多边形。

public void drawRect(int x, int y, int width, int height)                         画矩形。

public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)        使用当前颜色画圆角矩形。

public abstract void drawString(String str, int x, int y)                                    使用当前字体和颜色画字符串str。

public abstract void setColor(Color c)                                 设置图形上下文的当前颜色。

public abstract void setPaintMode()                                   设置画模式。

public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer)  画特定图。

public abstract void setFont(Font font)                                设置特定的font字体。使用时首先得到font对象的一个实例,Font类常用构造函数为:

public Font(String name, int style, int size)

通过指定的name、style和size创建字体实例。name指字体名,像“隶书”、“TimesRoman”等,字体风格为粗体、斜体,size指字号大小。

例如:

Font f = new Font("TimesRoman",Font.BOLD + Font.ITALIC, 12);

创建了具有粗斜体风格的12磅的TimesRoman字体。

例:

 import java.awt.*;
import java.applet.*;
import java.awt.geom.*;
public class UseColor extends Applet
{
public void paint(Graphics oldg)
{
Graphics2D g = (Graphics2D)oldg;
g.setColor(Color.blue);
g.fill(new Ellipse2D.Float(50,50,150,150));
g.setColor(new Color(255,0,0,0));
g.fill(new Ellipse2D.Float(50,50,140,140));
g.setColor(new Color(255,0,0,64));
g.fill(new Ellipse2D.Float(50,50,130,130));
g.setColor(new Color(255,0,0,128));
g.fill(new Ellipse2D.Float(50,50,110,110));
g.setColor(new Color(255,0,0,255));
g.fill(new Ellipse2D.Float(50,50,90,90));
g.setColor(new Color(255,200,0));
g.fill(new Ellipse2D.Float(50,50,70,70));
}
}

输出结果:

3 Graphics2D类

Graphics2D类继承于Graphics类,提供几何学、坐标变换、颜色管理以及文本排列等的更高级控制。

Graphics2D类是Java平台上渲染二维图形、文字、以及图片的基础类,提供较好的对绘制形状、填充形状、旋转形状、绘制文本、绘制图像以及定义颜色的支持。

在AWT编程接口中,用户通过Paint方法接收Graphics对象作为参数,若是使用Graphics2D类,就需要在Paint方法中进行强制转换。

Public void paint(Graphics old)

{

Graphics2D new = (Graphics2D)old;

}

3.1  绘制形状

Graphics2D提供以下两个方法进行形状的绘制:

public abstract void draw(Shape s)

根据Graphics2D的环境设置画出形状s,其中Shape接口包含的类如表所示。

其中GeneralPath是一般的几何路径,它的构造函数为:

public GeneralPath()                构造一个空的对象。

常用的方法有四个,分别如下:

public void lineTo(float x, float y)                                从当前坐标点到(x,y)坐标点画一条直线,将此点添加到路径上。

public void moveTo(float x, float y)                             移动到坐标点(x,y),在路径上添加此点。

public abstract void fill(Shape s)                                 画实心形状s。

public void quadTo(float x1, float y1, float x2, float y2)                                   以坐标点(x1,y1)为控制点,在当前坐标点和坐标点(x2,y2)之间插入二次曲线片断。

public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3)         以(x1,y1)和(x2,y2)为控制点,在当前坐标点和(x3,y3)之间插入曲线片断。

在Draw方法中提到Graphics2D的环境设置。所谓的环境设置是指设置画图的笔画和填充属性等,设置方法分别如下:

public abstract void setStroke(Stroke s)                    设置笔画的粗细。其中Stroke接口中常用BasicStroke类来实现,一个较简单的构造函数为

public BasicStroke(float width)                   创建实线笔画宽度为width。

public abstract void setPaint(Paint paint)           

设置Graphics2D环境的填充属性。其中,paint的值可以为渐变填充类java.awt.GradientPaint,也可以为图形填充类java.awt.TexturePaint,渐变填充类常用构造函数为

public GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2, boolean cyclic)

构建一个渐变GradientPaint对象,在起始坐标点到目标坐标点之间从颜色color1到color2渐变,cyclic为真,循环渐变。

 package test;

 import java.awt.*;
import java.applet.*;
import java.awt.geom.*;
public class GUI2D extends Applet
{
/**
*
*/
private static final long serialVersionUID = 5012904640684084416L; public void paint(Graphics oldg)
{
Graphics2D g = (Graphics2D)oldg;
//设置笔画宽度
BasicStroke stroke = new BasicStroke(10);
g.setStroke(stroke);
//画线
Line2D line = new Line2D.Float(0,0,20,30);
g.draw(line);
line = new Line2D.Float(50,50,100,50);
g.draw(line);
line = new Line2D.Float(50,50,50,100);
g.draw(line);
stroke = new BasicStroke(5);
g.setStroke(stroke);
//设置渐变填充
GradientPaint gt = new GradientPaint(0,0,Color.green,50,30,Color.blue,true);
g.setPaint((Paint)gt);
//画矩形
Rectangle2D rect = new Rectangle2D.Float(80,80,40,40);
g.draw(rect);
rect = new Rectangle2D.Float(100,100,40,40);
g.fill(rect);
//画椭圆
Ellipse2D ellipse = new Ellipse2D.Float(120,120,30,40);
g.draw(ellipse);
gt = new GradientPaint(0,0,Color.red,30,30,Color.yellow,true);
g.setPaint((Paint)gt);
ellipse = new Ellipse2D.Float(140,140,20,20);
g.fill(ellipse);
//画圆角矩形
RoundRectangle2D roundRect = new RoundRectangle2D.Float(160,160,40,40,20,20);
g.draw(roundRect);
roundRect = new RoundRectangle2D.Float(180,180,40,40,20,20);
g.fill(roundRect);
//画几何图形
GeneralPath path = new GeneralPath();
path.moveTo(150,0);
path.lineTo(160,50);
path.curveTo(190,200,240,140,200,100);
g.fill(path);
}
}

输出结果:

3.2  绘制文本

Graphics2D类提供一个文本布局(TextLayout)对象,用于实现各种字体或段落文本的绘制。其构造函数为:

public TextLayout(String string, Font font, FontRenderContext frc)                          通过字符串string和字体font构造布局。

public void draw(Graphics2D g2, float x, float y)                              将这个TextLayout对象画到Graphics2D对象g2上的x,y坐标处。

public Rectangle2D getBounds()                                          返回TextLayout对象的区域。

例:

 import java.awt.*;
import java.applet.*;
import java.awt.geom.*;
import java.awt.font.*;
public class GUIText extends Applet
{
public void paint(Graphics oldg)
{
Graphics2D g = (Graphics2D)oldg;
//设置字体
Font f1 = new Font("Courier",Font.PLAIN,24);
Font f2 = new Font("helvetica",Font.BOLD,24);
FontRenderContext frc = g.getFontRenderContext();
String str = new String("这是一个文本布局类的实现");
String str2 = new String("扩充绘制文本的功能");
//构造文本布局对象
TextLayout layout = new TextLayout(str, f1, frc);
Point2D loc = new Point2D.Float(20,50);
//绘制文本
layout.draw(g, (float)loc.getX(), (float)loc.getY());
//设置边框
Rectangle2D bounds = layout.getBounds();
bounds.setRect(bounds.getX()+loc.getX(),
bounds.getY()+loc.getY(),
bounds.getWidth(),
bounds.getHeight());
g.draw(bounds);
layout = new TextLayout(str2,f2,frc);
g.setColor(Color.red);
layout.draw(g,20,80);
}
}

3.3  绘制图像

绘制图像用到BufferedImage类,BufferedImage类是指存放图像数据的可访问的缓冲。其构造函数为:

public BufferedImage(int width, int height, int imageType)                使用宽度(width)、高度(height)和imageType类型构造BufferedImage对象。

public Graphics2D createGraphics()                                  用图片填充椭圆的具体过程如下:

(1) 创建一个Graphics2D,可以画到BufferedImage中。

例如构建一个BufferedImage对象buf。

BufferedImage buf = new BufferedImage (img.getWidth(this),

img.getHeight(this),BufferedImage.TYPE_INT_ARGB);

创建一个临时Graphics2D对象:

Graphics tmpG = buf.createGraphics();

将图像画入临时缓冲:

tmpG.drawImage(img,10,10,this);

(2)  用TexturePaint类进行填充:

public TexturePaint(BufferedImage txtr, Rectangle2D anchor)

构造TexturePaint对象,需要一个Rectangle2D对象来存放该对象:

Rectangle2D rect = new Rectangle2D.Float(0,0,h,w);

TexturePaint t = new TexturePaint(buf,rect);

(3) 然后设置填充模式,并进行填充:

g.setPaint(t);

g.fill(new Ellipse2D.Float(100,50,60,60));

例:完成图像显示,并将区域蓝色透明显示,然后进行图片填充

 import java.awt.*;
import java.applet.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.awt.image.*;
import java.net.*;
public class GUIImage extends Applet
{
public void paint(Graphics oldg)
{
Graphics2D g = (Graphics2D)oldg;
try
{
URL imgURL = new URL(getDocumentBase(),"sample.gif");
Image img = getImage(imgURL);
int h = img.getHeight(this);
int w = img.getWidth(this);
//构造缓冲图像对象
BufferedImage buf = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
//放入临时图形类
Graphics tmpG = buf.createGraphics();
tmpG.drawImage(img,10,10,this);
g.drawImage(buf,10,20,this);
//设置透明颜色对象
Color transBlue = new Color(0,0,255,100);
g.setColor(transBlue);
GeneralPath path = new GeneralPath();
path.moveTo(60,0);
path.lineTo(50,100);
path.curveTo(160,230,240,140,200,100);
g.fill(path);
transBlue = new Color(0,0,255,240);
g.fill(new Ellipse2D.Float(100,100,50,50));
Rectangle2D rect = new Rectangle2D.Float(0,0,h,w);
//图片填充
TexturePaint t = new TexturePaint(buf,rect);
g.setPaint(t);
g.fill(new Ellipse2D.Float(100,50,60,60));
}
catch(Exception e)
{
System.out.println("Error:" + e.getMessage());
}
}
}

Java—图形处理的更多相关文章

  1. java图形处理-Java Graphics2D

    java.awt 类 Graphics2D java.lang.Object 继承者 java.awt.Graphics 继承者 java.awt.Graphics2D public abstract ...

  2. Java图形处理

    paint.repaint.update方法   Graphics类.     用于实现组件的画图.包括组件对象,坐标,区域,颜色,字体,画图模式等   Color类     用来封装颜色   Gra ...

  3. 识别率很高的java文字识别技术

    java文字识别程序的关键是寻找一个可以调用的OCR引擎.tesseract-ocr就是一个这样的OCR引擎,在1985年到1995年由HP实验室开发,现在在Google.tesseract-ocr ...

  4. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  5. Java 调用 C++ (Java 调用 dll)康哥手把手教你

    摘要: 本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4979243.html 因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是 ...

  6. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  7. java系列: 对不起,JavaFX——Java 8目前还不能救你(zz)

    JavaFX 是SUN公司在2007年JavaOne大会上首次对外公布的以Java为基础构建的富客户端平台,更让开发者印象比较深刻的则是其背后的JavaFX开发团队,仅仅在两年的时间就从1.0版本完善 ...

  8. JAVA智能设备基于OpenGL的3D开发技术 之AABB碰撞检测算法论述

    摘要:无论是PC机的3D还是智能设备应用上,碰撞检测始终是程序开发的难点,甚至可以用碰撞检测作为衡量3D引擎是否完善的标准.现有许多3D碰撞检测算法,其中AABB碰撞检测是一种卓有成效而又经典的检测算 ...

  9. 009 The Interfaces In JAVA(官网文档翻译)

    Interfaces There are a number of situations in software engineering when it is important for dispara ...

随机推荐

  1. Eclipse创建maven项目

    许久不创建maven web项目了,今天上手很是陌生,搜集资料后终于创建成功,跟大家也分享一下,同时也便于以后再次忘记使用... 新建maven项目(右击new,若不存在,可在other里面寻找)

  2. zigbee学习之路(十一):看门狗

    一.前言 今天,我们要通过实验学习和认识一下看门狗的使用,看门狗是为了防止防止程序跑飞的,通过不断的喂狗,使看门狗能持续监管程序的运行状态,当程序跑飞时,能及时把程序拽回来. 二.原理与分析 在CPU ...

  3. 新版macbook air OS X El Capitan 10.11安装WIN找不到驱动介质???

    这个问题已经解决 首先进入Boot Camp6 以后 顶上会有一个操作 -下载windowns 驱动程序 保存在优盘里面.然后再分区选择ISO(中间和你前面做的一样)电脑重启进入WIN安装 到你们出现 ...

  4. 复旦大学2015--2016学年第二学期(15级)高等代数II期末考试第六大题解答

    六.(本题10分)  设 $n$ 阶复方阵 $A$ 的特征多项式为 $f(\lambda)$, 复系数多项式 $g(\lambda)$ 满足 $(f(g(\lambda)),g'(\lambda))= ...

  5. apache域名本地映射

    A: 第一步(搜索allow) 第二步(搜索vhost) 第三步(搜索rewrite) B: C:

  6. GOLANG 基本数据类型 整型

    基本数据类型-整型 种类     有符号(负号)      int8 int16 int32 int64 无符号(无符号) uint8 uint16 uint32 uint64 架构特定(取决于系统位 ...

  7. scrapy基础教程

    1. 安装Scrapy包 pip install scrapy, 安装教程 Mac下可能会出现:OSError: [Errno 13] Permission denied: '/Library/Pyt ...

  8. Android Studio -修改LogCat的颜色

    Android Studio -修改LogCat的颜色 author:Kang,Leo weibo:http://weibo.com/kangyi 效果图 设置 Preference->Edit ...

  9. 团队作业week14

    0 如果你的团队来了一个新队员,有一台全新的机器,你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境, 并成功地把最新.最稳定版本的软件编译出来,并运行必要的单元测试?(在这 ...

  10. Linux内核创建一个新进程

    张雨梅   原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 创建新进程 如果同一个程序被多 ...