绘图

java

  • java2D是一组支持高质量二维图形、图像、颜色和文本的类。它可用于绘制诸如圆、多边形等几何形状,使用各种字体、颜色和线宽,处理颜色和图案。
  • 在以前的版本中,Graphics类包含基本的图形支持功能,但在Java2D中,这些方法已被更为复杂,效率更高的方法所代替。
  • java2D中的第一个类是Graphics2D,它是Graphics的子类,它表示一种可在其中绘制图形的环境,Graphics2D对象可能表示图形用户界面、打印机、或其他显示设备上的一个组件。它包含java2D所需的扩展特性。
  • java中的用户界面组件一般都有一个paintCompoent(Graphics)的方法,每当组件需要重新显示时,该方法都被自动调用
  • 导致paintCompoent(Graphics)被调用的事件很多,其中包括:
    (1)包含组件的图形用户界面首次被显示。
    (2)位于组件上面的窗口被关闭。
    (3)包含组件的图形用户界面的大小被调整。

图形坐标系

  • java2D使用的x,y坐标系与我们设置框架大小时使用的相同。
  • java的坐标系以像素为作为度量单位。坐标原点(0,0)位于组件的左上角。从原点沿水平方向向右移动时,x坐标将增多;沿垂直方向向下移动时,y坐标将增大。所有的像素值都是整数,不能使用小数来指定显示位置。

绘制文本

  • 要绘制文本,可调用Graphics2D对象的drawString()方法,并提供三个参数,(1)要显示的String
    (2)显示位置的x坐标
    (3)显示位置的y坐标
abstract  void drawString(String str, float x, float y) 
          使用 Graphics2D 上下文中当前文本属性状态呈现由指定 String 指定的文本。 
abstract  void drawString(String str, int x, int y) 
          使用 Graphics2D 上下文中的当前文本属性状态呈现指定的 String 的文本。 
  • 上面的绘制使用的是默认字体。要使用其他字体,必须创建一个Font对象,Font对象表示字体的颜色、字形和字号。创建Font对象,需要将三个参数传递给它的构造函数。`
Font(String name, int style, int size) 
(1)字体名称
字体的名称可以是TrueType字体的名称,如Arial、Garamond或Kaiser等。也可以是五种通
用字体之一:Dialog、DialogInput、Monospaced、SanSerif或Serif。这些字体用来指定要使
用的字体类型,而不要求使用特定的字体。
(2)字形
可选择的字形有三种,分别是静态类常量,Font.PLAIN,Font.BOLD、Font.ITALIC
(3)字号
 Font 的磅值大小
  • 创建字体后,便可以用该字体为参数调用Graphics2D的setFont(Font)方法来使用它,setFont()方法设置后面调用drawString()方法时将使用的字体,以后需要绘制其他文本时,可以再次调用setFont()方法来修改字体。
  • 为了是图形用户界面的文本美观大方,常常需要确定文本在界面组件上占用多少空间,java.awt中的FontMetrics类提供了这样的方法,即可以确定以指定的字体显示时字符有多大,通过该类可用于格式化或文本居中。
  • 通过getFontMetrics(Font)来返回一个FontMetrics对象,通过该对象获取有关当前字体的详细信息,如字符的宽度和高度
int getHeight() 
          获取此 Font 中文本行的标准 height。 
 int charWidth(char ch) 
          返回此 Font 中指定字符的 advance width。 
 int stringWidth(String str) 
          返回此 Font 中指定 String 的总 advance width。 

颜色

  • 默认情况下,java根据颜色描述系统sRGB来使用颜色,在这种系统中,颜色用其包含的红色、绿色和蓝色成分来描述的-这正是R、G、B的意思。
  • 要设置当前的绘图颜色,可以创建一个Color对象来表示它,也可以是使用Color的标准颜色。为创建颜色对象,可通过两种不同的方式来调用Color构造函数:
Color(int r, int g, int b) 
          创建具有指定红色、绿色和蓝色值的不透明的 sRGB 颜色,这些值属于 (0 - 255) 。
Color(float r, float g, float b) 
          创建具有指定红色、绿色和蓝色值的不透明的 sRGB 颜色,这三个颜色值
          都在 (0.0 - 1.0) 的范围内。
例如
Color c1 =new Color(0.807F,1F,0F);
F代表是个浮点数,不要与十六进制混淆。
Color c2 =new Color(255,204,102);
  • 当前的绘图颜色可使用类Graphics的setColor()方法来指定。必须对表示绘制区域的Graphics或Graphics2D对象调用该方法。
  • 设置颜色的方法之一是使用Color中的标准颜色,这些颜色是使用类变量表示的。表示颜色的类变量有black(0,0,0),blue,cyan,darkGray,gray,green。例如g.setColor(Color.pink)(g为Graphics或Graphics2D对象)。
  • 或者使用Color对象进行绘制
Color brush =new Color(255,204,102);
g.setColor(brush);

设置完颜色后,所有的画图操作都将使用该颜色。

  • 可以通过setBackground()设置背景色,getForeground()设置前景色。

绘制直线和多边形

  • 绘图方法都是在组件的paintCompoent()方法中调用的。
  • java2D特性包括:
    (1)绘制空的多边形或用纯色填充的多边形。
    (2)使用特殊的填充图案,如渐变或图案。
    (3)定义了画笔的宽度和样式。
    (4)通过反走样来是对象的边界变得平滑化。

指定渲染属性

  • 在2D操作时可以指定绘制的对象如何被渲染,绘制非2D对象时,只能选择一个属性:颜色。
  • java2D提供了大量的属性,用于指定颜色、线宽、填充图案、透明度和其他特征。

填充图案

  • 填充图案控制对象将如何被填充。在java2D中,我们可以使用纯色,渐变填充,纹理或者我们自己设计的图案。
  • 使用Graphics2D的setPaint()方法可以定义填充图案,该方法接受一个paint对象作为其唯一的参数,可作为填充图案的类包括GradientPaint(渐变填充),TexturePaint(纹理填充),Color(颜色)都实现了接口Paint。
  • 渐变填充指的是从一个坐标点上的某种颜色逐渐变化到另一个坐标点上的另一种颜色。这种变化可在两个点间发生一次或多次,发生一次叫做非周期渐变,发生多次叫做周期渐变。
  • 用同一个GradientPaint对象进行填充,得到的图形未必一样,用渐变填充的图形是从布上剪下的图案,且可以从一块布上剪切下多块图案。
GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2) 
          构造一个简单的非周期性 GradientPaint 对象。 
GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2, boolean cyclic) 
          根据 boolean 参数构造一个周期性或非周期性的 GradientPaint 对象。 
			x1 - 用户空间中第一个指定 Point 的 x 坐标
			y1 - 用户空间中第一个指定 Point 的 y 坐标
			color1 - 第一个指定 Point 处的 Color
			x2 - 用户空间中第二个指定 Point 的 x 坐标
			y2 - 用户空间中第二个指定 Point 的 y 坐标
			color2 - 第二个指定 Point 处的 Color
			cyclic - 如果渐变模式在两种颜色之间重复循环,则为 true;否则为 false。

设置画笔

  • 在以前的java版本中,在所有的绘图操作中绘制直线的宽度都为1个像素,在java2D中,可以通过setStroke()方法并用BasicStroke作为参数传递给它,来改变绘制的直线的宽度。
BasicStroke(float width, int cap, int join) 
          构造一个具有指定属性的实心的 BasicStroke。
          width - BasicStroke 的宽度
             表示线宽为几个像素
          cap - BasicStroke 端点的装饰
              决定线段两端的修饰样式,可以为CAP_BUTT(没有样式),CAP_ROUND(圆形
              端点),CAP_SQUARE(方形端点)
          join - 应用在路径线段交汇处的装饰
              决定线段间的连接样式,可以为JOIN_MITER(通过扩展两条线段的外边界来将它
              们连接起来)、JOIN_ROUND(将两条线段圆滑的地连接起来)和JOIN_BEVEL()
              (用一条直线将两条线段连接起来)

创建要绘制的对象

  • 在java2D中,要绘制的对象是通过使用java.awt.geom包中的类,将其定义为几何图形来创建的。我们可以绘制线段,矩形,椭圆,圆弧和多边形。
  • 绘制各种图形时,不是调用Graphics2D类的不同方法;而是定义要绘制的图形,并将其用作方法draw()和fill()的参数。
线段
  • 线段是通过Line2D.Float或者Line2D.Double来创建的。
Line2D.Float(float x1, float y1, float x2, float y2) 
          根据指定坐标构造并初始化 Line。
Line2D.Double(double x1, double y1, double x2, double y2) 
          根据指定坐标构造并初始化 Line2D。

例如

Line2D.Float ln =new Line2D.Float(60F,5F,13F,28F);
创建一条端口分别为(60,5)和(13,28)的线段。
矩形
  • 矩形是使用类Rectangle2D.Float或Rectangle.Double来创建的。这两个类之间的区别在于:一个接收Float参数,一个接收Double参数。
Rectangle2D.Float(float x, float y, float w, float h) 
          根据指定的 float 坐标构造和初始化 Rectangle2D。
Rectangle2D.Double(double x, double y, double w, double h) 
          根据指定的 double 坐标构造和初始化 Rectangle2D。

例如

Rectangle2D.Float ee  = new Rectangle2D.Float(113F,25F,22F,40F);
创建一个矩形,左上角坐标(113,25),宽度为22,高度为40
椭圆
  • 椭圆类是使用类Ellipse2D.Float或Ellipse2D.Double来创建的
Ellipse2D.Float(float x, float y, float w, float h) 
          根据指定坐标构造和初始化 Ellipse2D。
Ellipse2D.Double(double x, double y, double w, double h) 
          根据指定坐标构造和初始化 Ellipse2D。`
  • 圆弧是使用Arc2D.Float或Arc2D.Double类来创建的
Arc2D.Float(float x, float y, float w, float h, float start, float extent, int type) 
          构造一个新弧,并将其初始化为指定的位置、大小、角跨越和闭合类型。
        x - 弧的窗体矩形左上角的 X 坐标。
		y - 弧的窗体矩形左上角的 Y 坐标。
		w - 完整椭圆的总宽度,此弧是该椭圆的一部分。
		h - 完整椭圆的总高度,此弧是该椭圆的一部分。
		start - 弧的起始角度(以度数表示)。
		extent - 弧的角跨越(以度数表示)。
		type - 弧的闭合类型:Arc2D.OPEN、Arc2D.CHORD 或 Arc2D.PIE。
多边形
  • 在java2D中,多边形是通过从一个顶点移到另一个顶点来创建的。多边形可以由直线,二次曲线,和凡赛尔曲线构成。
  • 创建多边形的运动被定义为GeneralPath对象。
      GeneralPath polly = new GeneralPath();
  • 使用该对象的moveTo()方法创建多边形的第一个顶点
       polly.moveTo(5f,0f);
  • 使用LineTo()方法来创建多边形的边
     polly.LinTo(205F,0F);
     polly.LinTo(205F,90F);
     polly.LinTo(5F,0F);
     将三条边加入到polly对象中去
  • 通过closePath()方法可以闭合多边形
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值