http://passmatlab.bokee.com/3779555.html

用三个Java类设置文本显示

关键词java显示,字体大小,显示位                                          

回顾
为了使用Graphics类的text方法,理解Graphics类所扮演的角色是必需的。这节概述Graphics类的功能和操作。
Graphics 类在AWT中扮演了两个不同但有联系的角色。首先, 它维维护着由影响图形操作结果的所有信息组成的图形环境,这包括显示的颜色、字体、位置和尺寸,字体,并且地点和载剪矩形的尺寸 (在些区域的图形能被绘制)。更重要的是, 图形环境定义了下面将讨论到的图形操作的目的地 ( 目的地包括部件和图象 ) 。
除了图形环境这一角色,Graphics类还提供绘制简单几何图形、显示文本及将图象放入图形目的地的方法,在一个部件或图象上的所有与图形有关的操作都通过这些方法产生。
为 了绘制,程序要求有一个有效的图形环境( 由Graphics类的一个实例表示)。因为Graphics类是一个抽象的基类,它不能直接被实例化。一个具体的实例被一个部件创建,并且然后作为一个 参数传递给程序到一个部件的update()和paint()方法。这两个方法作为AWT内周期绘制的一部分被调用。
Graphics类与Font类和FontMetrics类一起提供必要的工具在一幅图象或部件内绘制文本。让我们开始用Graphics类绘制文本的练习。
Graphics类
Graphics类提供了三个在部件和图象中绘制文本的方法。
void drawString(String str, int x, int y)
drawstring()方法用一个包含将要被显示文本的字符串实例以及两个指定文本开始坐标的整型值作为参数。
public void paint(Graphics g)
{
g.drawString("abc", 25, 25);
}
上面列的代码显示了在paint()方法内使用drawString()方法。这个范例代码在含paint()方法的部件中显示字符“abc”,x和y坐标指明文本框左下角位置。图1显示了将此代码放在适当的AWT组件对象中显示的结果。

 

图1:一个drawString()示范


void drawChars(char [] data, int offset, int length, int x, int y)
drawChars()方法有以下参数:一个将要被显示成文本的字符数组,一个指定将从第几个字符开始显示的整型值,一个指点将要显示几个字符的整型值,以及将从哪个位置显示的两个整型值。
public void paint(Graphics g)
{
   char [] rgc = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };

   g.drawChars(rgc, 0, 5, 25, 25);
   g.drawChars(rgc, 5, 5, 25, 50);
}
以上代码是一个在paint()方法中引用drawChars()的例子,字符数组被显示在两个部分。第一次,参数指定从第一个字符开始显示,并显示5个字符;第二次显示剩下的5个字符,并和第一次显示的结果拉开25个像素,图2显示了代码运行结果。

 

图2:一个drawChars()示范



void drawBytes(byte [] data, int offset, int length, int x, int y)
象下面显示的一样,drawBytes()方法带有一个包含要显示文本的byte数组,一个指明数组开始偏移量的整型值,一个指明byte长度的整型值和两个指明文本开始坐标的整型值。
public void paint(Graphics g)
{
byte [] rgb = { 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't' };
g.drawBytes(rgb, 0, 5, 25, 25);
g.drawBytes(rgb, 5, 5, 25, 50);
}
上面的代码显示了在一个paint()方法内使用的drawBytes()方法。图表3显示了如果这段代码放入一个合适的AWT对象中将出现的结果。

 

图表3:一个drawBytes()范例


Unicode 支持
Java 被极力赞扬的原因之一是它可经由Unicode支持国际通用的脚本。不幸的是由Java 程序语言1.0版本提供的Java类库并不完全支持这一点。然而, 似乎转机就在眼前,初期的国际化API可从SunSoft得到。JDK 1.0仅限于显示Unicode 的拉丁文-1子集中的字符。这种限制在JDK 1.1被去掉。现在Java程序能够显示任何一种用主机字体修饰的Unicode字符。Java提供少数预定义“虚拟”字体命名并映射到主机上的真实字 体。在JDK 1.0中,每个Java字体名称严密地与一主机字体映射。在JDK 1.1中,一个Java字体名称能印射到一系列主机字体。可选择将主机字体系列用Unicode 字符集代替。
文本的放置
因为文本只是AWT的另外一种形式,一行文本可以被放在任何地方——甚至在另一行文本的上方。随意放置文本并不能令视觉愉悦,为了帮助程序员创建具有审美效果的文本,一个字体定义就包括行与字符的放置指南。这些指南可以帮助创建美妙的输出效果。
图4包含了一行文本并标出了我们准备讨论的一些属性。

 

图4:一行文本


在前一节方法中的y坐标参数指定了文本行的baseline位置。baseline是一行文本的大部分字符都在其上面的那一根线(除那些下行字母例外如“g”和“y”)。baseline并不是字体的一个特征但确是所有与其涉及的其它字符的参考点。
Ascent是从baseline到字体中部分字符顶部的距离,典型的是字体中大写字母和象“f”及“h”字符的高度。这仅是一个大概原则,然而,字体中的一些字符可能实际上会延伸到这个距离的上面。
Descent是从baseline到有下行字母的字体中字符底部的距离——象“p”、“q”和“y”等字符。这只是一个大概原则,在一种字体中的某些字符可能实际会延伸到这距离的下面。
Leading是一行文本的descent与ascent间的空间距离。一行文本的高度包括这个延伸空间部分。
另外整体控制字体的一个特征就是,在一种字体的每个字符中都有advance。advance指定字符的开始处与它右边字符的开始处间隔多少象素;简言之,它是一个字符的宽度。在一种字体中的一些字符可能实际上超过这个距离。
通过将一行文本的所有字符的宽度加起来可以计算整行文本的长度,下面将介绍的FontMetrics类提供了与此有关的方法。
FontMetrics类
FontMetrics类提供了一个简单的方法得到上面讨论过的属性,下面就是getFontMetrics方法:
public void paint(Graphics g)
{
FontMetrics fm = g.getFontMetrics();
.
.
.
}
上面的代码示范了如何得到字体的尺度信息。getFontMetrics()方法返回一个FontMetrics类的实例,FontMetrics类提供了如下的方法:
int getAscent() 返回字体的ascent。
int getDescent() 返回字体的descent。
int getLeading() 返回字体的leading。
int getHeight() 返回字体的height。字体高是字体ascent、descent和leading的总和。
int charWidth(int ch) 返回指定字符的宽度。
int charWidth(char ch) 返回指定字符的宽度。
int [] getWidths() 返回一个包含字体头256个字符宽度的整型数组。
象上面提到的一样,那些整理字体的字符有时可能超过ascent、descent及用上述方法得到的宽度,在这种情况下精确的数值是必需的,下面的方法提供了这种功能。
int getMaxAscent()返回字体的最大ascent。
int getMaxDescent()返回字体最大descent。
int getMaxAdvance()返回字体的宽度。
下面的方法提供了关于一串字符占据的宽度信息。
int stringWidth(String str)返回字符串宽度。
int bytesWidth(byte [] rgb, int offset, int length)返回从offset开始的length长的bytes的宽度。
int charsWidth(char [] rgc, int offset, int length) 返回从offset开始的length长的字符的宽度。
Font类
Font类封装了关于字体的一些信息,一个新的字体是通过创建一个带名称、类型及点阵大小的字体类实例来产生的。
Font f = new Font("Dialog", Font.PLAIN, 12);
一旦创建,一个字体就可以被分配给一个Graphics对象实例。
g.setFont(f);
Graphics对象将字体应用到所有以后与图形操作有关的文本。
Font类提供了一旦字体被创建后取得其相关信息的方法。
String getName()返回字体的名称。
String getFamily()返回特定字体名称的平台。
int getSize()返回字体的点阵大小。
int getStyle()返回字体的类型。
boolean isBold()返回是否字体加粗。
boolean isItalic()返回是否字体倾斜。
boolean isPlain()返回字体是否无格式。
一个范例
图5中的applet显示了一行文本在上面讲述的不同度量值时的情况。在baseline上是一根粗黑线,另外两根线标明了字体的ascent和descent,小竖线标明了字符的宽度,三个下拉式菜单允许你选择字体、字形及字号。

 

 

 

图5:一个交互式的字体尺度浏览器


结论
applet使用Graphics、Font和FontMetrics扩展类,它的源代码 在这里:http://www.javaworld.com/javaworld/jw-01-1997/howto/Main.java。 Graphics类象是待勘探的肥沃的土地,以后我们会继续接触到其他方面。