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));
}
}
///
运行后在网页上显示如下(位置不算):
创建了字体对象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);
}
}
所有评论(0)