Java提供的Graphics类是用于绘图和显示格式化文字的工具。绘图必须在一个窗口(容器)中进行,Java小程序Applet就是一个窗口。本章我们只介绍Graphics类的绘制基本图形和格式化文字显示这两部分功能,其余内容在以后需要的时候再研究。

1 在Applet中写字和画图

要创建一个Applet,必须让自己的类从java.allpet.Applet类继承即可。Applet类是一个抽象类,它提供了五个抽象方法,它们是:

  • init( )  applet初始化,在applet首次创建时执行。 
  • start()  applet开始正常运作。在每次applet画面在浏览器窗口中可见时调用,也在init()后调用。 
  • stop( )  停止运作。每当applet画面移出浏览器窗口的可见区域时调用,也是destroy( )前被调用。 
  • paint()  在applet窗口中或画布上写字画图。也在update()方法中被自动调用。 
  • destroy()废弃当前applet的实例。在applet从网页上重新装载时调用。

Graphics类在java.awt包中被声明。AWT(Abstract Windows Toolskit)的名称是抽象窗口工具包,是提供窗口及其组件的类库。写字和画图是用Graphics的drawXXX方法实现的。如drawString(String),drawLine(.)等。画图用的坐标系是原点在左上角,纵轴向下以象素为单位的坐标系。

下面我们给出一个简单的示例说明在Applet中写字和画图的基本方法。

例1 Applet中写字和画图的基本方法。

///
import java.awt.*;
import java.applet.*;
public class DrawBasic extends Applet {
   public void paint(Graphics g) {
        g.drawString("用Graphics写字和画图的基本方法", 20,40);
        g.drawOval(100, 100, 30, 30);
        g.drawOval(200, 100, 40, 25);
        g.drawLine(20, 140, 200,140);
        g.drawRect(20, 160, 50, 80);
        g.drawRoundRect(110, 160, 100, 100, 25, 18);
    }
}
///

在窗口显示文字用 g.drawString(String, intX, intY)。intX,intY是开始显示的位置。画椭圆用g.drawOval(中心坐标,长轴,短轴),画直线用g.drawLine(起点,终点),画矩形用g.drawRect(左上角坐标,X边长,Y边长)。drawRoundRect是圆角矩形,比矩形对两个参数表示圆角的大小。

2 设置颜色和字体

例1中的文字使用默认的字体和大小和默认的黑色,不免单调。使用不同的字体字号和选择不同的颜色是美化网页必不可少的。
设置背景色的是方法继承自Applet的,语法为:
    setBackground(new Color(int,int,int))
即它的参数是一个Color对象句柄。
设置前景色的方法是属于Graphics的,即设置Graphics的绘图色。语法为:
    g.setColor(Color对象);
选择颜色有两种方法,一是直接用颜色值RGB创建Color对象,如:
    Color color = new Color(R,G,B)
另一种是用颜色常量如Color.red, Color.green等。Color类提供了13种颜色常量,由其格式可知它们都是静态的终极的。

设置字体需要使用java.awt.Font类创建一个Font对象。Font的常用构建器形如:
    Font(字体名或逻辑字体名,字型,字号)
字体名是运行程序的操作系统适用的字体,字型为Font类声明了的静态常量,有下列4种:
    Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD|ITALIC
分别表示正常、粗体、斜体和粗斜体。下面的例程演示设置颜色和字体的方法。

例2 本例程演示设置颜色和字体。

///
import java.awt.*;
import java.applet.*;
public class FontDemo extends Applet {
  public void paint (Graphics g){
   String s1 = "This Font is ";
   Font font = new Font("Arial", Font.BOLD, 18);
   g.setColor(Color.red);
    setBackground(new Color(0,255,0));
   g.setFont(font);
   g.drawString(s1 + font.getName() ,20, 60);
   g.setFont(new Font("隶书", Font.BOLD, 28));
   g.drawString("现在是隶书" ,20, 120);
   g.setColor(new Color(0,0,0));
   }
}
///

运行后在网页上显示如下(位置不算):

This Font is Arial

现在是隶书

创建了字体对象font后,只要简单地用g.setFont(font)设置使用新字体。直到再次使用setFont前都有限。在实际应用时最好先保存原有的颜色和字体设置,在使用完了后再恢复。

drawString方法只使用起点的坐标。下一行显示在什么位置很难精确定位。要想精确定位,我们需要知道字符串显示的长度(象素)以控制水平方向的尺寸,知道字体的高度以控制垂直方向的尺寸。Java另外提供了FontMetrics类来解决排版问题。这里介绍它的两种方法就可以满足我们的简单需要。用Graphics的getFontMetrics方法创建一个FontMetrics对象,它的getHeight()方法可得到字高,stringWidth(String)方法得到字符串占用的宽度。 
   FontMetrics fm = g.getFontMetrics(font); // 创建一个FontMetrics对象
   int height = fm.getHeight();
   int width = fm.stringWidth(s1);

例3 FontMetrics对象的简单用法。

///
import java.awt.*;
import java.applet.*;
public class FontMetricsDemo extends Applet {
  public void paint (Graphics g){
   String s1 = "Hello, Java World!";
   g.setColor(Color.red);
   setBackground(new Color(0,255,0));
   Font font = new Font("Arial", Font.BOLD, 18);
   g.setFont(font);
   FontMetrics fm = g.getFontMetrics(font);
   int height = fm.getHeight();
   int width = fm.stringWidth(s1);
   int posx =50; int posy = 50;
   g.drawString(s1 ,posx, posy);
   g.drawString("I will come in." ,posx +width, posy+height);
   }
}
///

运行后在网页上显示大致如下:

  Hello, Java World! 

I will come in.

Java有一个类叫GraphicsEnvironment提供绘图环境,它有一个方法叫getAvailableFontFamilyNames(),由它可以得到程序所在机器操作系统的所有字体名(是String不是Font)。下面的程序在网页上显示所有可用的字体名称和实际形状。由于字体种类很多,一屏幕放不下,只在设定的Applat的界限内显示。除非给窗口添加垂直滚动条,这在下一章中介绍。

例4 显示您的操作系统所有可有的字体名称。

///
import java.awt.*;
import java.applet.*;
public class FontAll extends Applet{
  public void paint(Graphics g) {
   GraphicsEnvironment gv =
      GraphicsEnvironment.getLocalGraphicsEnvironment();
   String[] ftNames = gv.getAvailableFontFamilyNames();
   for (int i=0; i<ftNames.length; i++) {
        Font ft = new Font(ftNames[i], Font.BOLD, 14);
   g.setPaintMode();
   g.setFont(ft);
   g.drawString(ftNames[i], 5, 15 * (i+1));
   g.drawString("Hello the world!", 200, 15 * (i+1));
   }
}
}
///

3 基本图形的绘制

这一节介绍Graphics拥有的绘图方法,除了矩形和卵形以外,还有多角形、填充图形和三维矩形等。所有方法都是void类型的。

drawLine(int,int,int,int)      画直线。起点坐标,终点坐标
drawRect(int,int,int,int)      画矩形。左角坐标,宽,高
drawRoundRect(int,int,int,int,int,int)  画圆角矩形。左角坐标,X宽,Y高,深度X,深度Y
draw3DRect(int,int,int,int,boolean)     画3D矩形。左角坐标,宽X,高Y,ture
drawOval(int,int,int,int)           画卵形。中心坐标,长轴,短轴 
drawArc(int,int,int,int,int,int)    画弧。左角坐标,宽,高,起始角,终止角
drawPolyline(int[],int[],int)       画折线。各点的X坐标,Y坐标,折线数 
drawPolygon(int[],int[],int)        画多角形。各点的X坐标,Y坐标,边数
drawPolygon(Polygon)                画多角形。定义好的多角形对象

画填充图形只有把以上九种方法中的draw改为fill即可,参数表是一样的,颜色就是g.setColor()设定的。注意fillRect()可以用来画一根粗实线。下面的例题我们分别画弧、多角形和三维矩形。

例5 画弧和多角形。

///
import java.awt.*;
import java.applet.*;
public class GraphArcPolygon extends Applet {
   public void paint(Graphics g) {
        //定义待画组合图形的中心
        Point p = new Point(cx / 2, cy / 2);
        //定义待画矩形的轮廓
        Rectangle rect = new Rectangle((p.x - 40), (p.y - 40), 80, 40);        //定义多边形的顶点
        int[] xP = {(p.x - 40), (p.x + 90), p.x+200, (p.x - 40)};
        int[] yP = {(p.y - 40), (p.y +140), (p.y + 60), (p.y-40)};
        g.drawArc(rect.x, rect.y, rect.width, rect.height * 2, 270, 90);
        g.drawPolygon(xP, yP,3);
        g.setColor(Color.red);
}

public void init() {
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension d = tk.getScreenSize();
    cx = d.width/2 ; cy = d.height/2;
}
   private int cx;
   private int cy;
}
///

例6 画填充图形3D矩形等。

///
import java.awt.*;
import java.applet.*;
public class Graph3DRect extends Applet {
   public void paint(Graphics g) {
        g.setColor(Color.green);
        g.fillArc(10, 10, 60, 40, 30, 60);
        g.fillOval(10, 60, 60, 40);
      g.fillRect(80, 10, 60, 40);
      Polygon p = new Polygon();
      p.addPoint(150, 10);
       p.addPoint(210, 10);
      p.addPoint(210, 50);
       p.addPoint(150, 50);
      g.fillPolygon(p);   //绘制高度为5个像素,视角为45度正方向的3维矩形
      g.fill3DRect(150, 10, 60, 40, true);
      for (int i=1; i<=5; i++)
          g.draw3DRect(150 + i, 10 - i, 60, 40, true);
   //绘制高度为5个像素,视角为135度正方向的3维矩形
       g.fill3DRect(150, 60, 60, 40, true);
      for (int i=1; i<=5; i++)
           g.draw3DRect(150 - i, 60 + i, 60, 40, true);
   }
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐