用三个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类象是待勘探的肥沃的土地,以后我们会继续接触到其他方面。
分享到:
相关推荐
总的来说,"中文文本分类源代码 使用JAVA"是一个利用Java实现的文本分类项目,涵盖了从文本预处理到模型训练、评估的完整流程。通过阅读和理解这些源代码,可以深入学习文本分类技术在Java环境下的实现方式,对于...
本篇文章主要探讨如何使用Java来设置Excel单元格的样式,包括对齐方式、文本旋转、换行以及缩进。为了实现这些功能,我们可以借助第三方库Free Spire.XLS for Java。 首先,要使用Free Spire.XLS for Java库,你...
为了实现这个功能,我们可以利用第三方库,比如`jacob`。`jacob`是一个Java到COM桥接库,允许Java程序调用COM组件。在这个场景下,我们将使用`jacob`来调用Windows的Text To Speech (TTS) 技术,即Microsoft的SAPI...
基于JAVA-gui的文本加解密小程序源码 本项目一共有四个类文件 第一个类文件是...第三个类文件是Base64.java,实现对文件的base64加密解密操作。 第四个类文件是Encode.java,实现对文件的ASCii码位移加密操作。
2. **Java文本比较算法**:在Java中,实现文本比对通常涉及字符串操作,如`equals()`、`contains()`等方法,但更复杂的比对需求会使用特定的算法。例如,Jaccard相似度、余弦相似度、Levenshtein距离等。 3. **...
对于余弦相似度,可以使用Java的`org.apache.commons.math3.ml.distance.CosineDistance`类;Jaccard相似度可以自定义函数计算两集合交集和并集的比例;编辑距离则可以借助第三方库如`com.github.jtobias:jellyfish`...
总的来说,创建一个简单的Java文本编辑器涉及了Java Swing组件的使用、事件处理以及文件I/O操作。通过这个项目,你可以更好地理解和掌握Java GUI编程以及文件操作的基本概念。随着技能的提升,你还可以进一步优化...
Java文本编辑器是一种基于Java编程语言开发的软件工具,它允许用户创建、修改和查看文本文件。在Java中实现文本编辑器涉及到多个核心概念和技术,包括Swing或JavaFX图形用户界面(GUI)库,事件处理,文件I/O操作...
《用Java设计文本编辑器MiniEditor》 在IT领域,设计和实现一个文本编辑器是一项基础但又重要的任务,它能帮助我们理解编程语言的基本特性、事件处理、UI设计等核心概念。本项目以Java为开发语言,设计了一个名为...
在Java中,读取文本文件通常涉及到使用`InputStream`及其子类如`FileInputStream`,以及`Reader`接口的实现类`BufferedReader`。以下是对读取操作的详细解释: #### 方法一:读取到`StringBuffer` - **实现方法**...
《TextClassifierCollection:Java文本分类工具包的深度解析》 在现代信息处理中,文本分类是一项至关重要的任务,它能够帮助我们自动地将大量文本数据归类到预定义的类别中,广泛应用于垃圾邮件过滤、新闻分类、...
本资源提供了一个使用Java语言结合jxl库实现的工具类,它简化了Excel文件的读写操作,并且允许对单元格样式进行自定义设置。下面我们将详细探讨相关的知识点。 1. **Java与Excel交互**: - Java通过第三方库如...
本工程为MyEclipse创建的java工程,用于探索如何将文本转换成语音。 本工程编码方式:UTF-8 参考http: 7个开源的TTS(文本转语音)系统:http://blog.csdn.net/gaohuanjie/article/details/22647159 3个开源TTS...
"src"通常用于存放源代码,其中可能包含多个Java源文件,每个文件对应一个类,这些类共同构成了文本编辑器的各个部分。而"bin"文件夹则可能包含了编译后的字节码文件(.class),这些文件是Java虚拟机执行的程序。...
2. 在Java代码中,使用`java.lang.reflect.InvocationHandler` 和 `java.lang.reflect.Proxy` 创建一个动态代理类,模拟TTS接口。 3. 使用`java.lang.Runtime.getRuntime().exec()` 或 `java.lang.ProcessBuilder` ...
2. **处理base64图片**:对每个base64格式的图片,使用Java的`Base64`类进行解码,并将结果保存到临时文件或内存中。 3. **处理网络图片**:使用HTTP客户端库(如Apache HttpClient或OkHttp)下载网络图片到服务器...
总结来说,这个Java文本编辑器项目是一个基础的文本处理工具,它结合了Java Swing库的功能,提供了一个简单易用的界面,让用户能够创建、编辑和管理文本文件。通过学习和理解这个程序,开发者可以深入掌握Java GUI...
文件列表中的“java文本转语音实例”可能是一个包含主类和其他相关类的项目结构,其中包含了具体的实现逻辑。通过解压并运行这个实例,你可以亲身体验Java文本转语音的全过程,加深对相关技术的理解。 总之,Java...
本文将详细介绍如何使用Java去除TXT文本文件的BOM头信息。 首先,我们需要理解BOM头的含义。BOM头是一个字节序列,用于表明文件所使用的字符编码。在UTF-8中,BOM头的字节序是EF BB BF。在UTF-16LE(小端序)中,它...
它可以将三个版本的文件进行对比,并协助用户解决冲突,确保合并后的代码是完整的且没有错误。 4. **版本控制系统集成**:该软件可以与常见的版本控制系统如Git、SVN等无缝集成,方便用户直接在工具中查看提交历史...