DOC-03-39 在JavaFX中使用文字(Text)

本章介绍如何在JavaFX应用程序中加入文本(Text),也包含一些样例代码来解释要使用的API。

介绍

JavaFX程序中的图形内容由许多对象组成,它们都被组织到了一个名为scene graph的树形结构之中。scene graph中的每个元素被称为一个node。node可以处理不同类型的内容,也包括文本。node可以被变换或者被添加动画效果。你也可以为node应用各种各样的特效。使用各种node类型所共有的特性可以让你提供复杂的文本内容,它们可以满足现代富互联网应用(Rich Internet Application,RIA)的需要。

JavaFX的SDK提供了javafx.scene.text.Text类,它被用来显示文本。Text类继承自Node类,因此你可以对Text应用特效、动画和变形,就像对其它各种node一样。由于Node类继承自Shape类,所以你可以像给其他任何shape一样为Text设置笔画或者填充模式。

添加文本

要在你的程序中添加Text对象,可以使用例39-1到39-3中的任意一个构造方法。

39-1

39-2

39-3

例39-3中的构造方法在前两个参数指定的坐标处创建了一个text对象。

设置文本字体和颜色

在添加Text的时候,你也可以为其设置一些属性。如果要设置字体,你可以使用一个javafx.scene.text.Font类的实例。Font.font()方法让你可以指定字体名称和大小。你也也可以设置文本颜色,如例39-4所示。

39-4

除此之外,你可能想要使用系统字体,其字体类型一般取决于平台类型。你可以通过调用Font.getDefault()方法来达到这个目的。

在实际的代码中,Oracle建议你使用CSS来设置样式。例如,如果要为你的Text对象应用线性渐变填充效果,则可以把所需的样式规则添加到你的CSS文件中,如例39-5所示。

39-5

在你的代码中可以创建Text对象并应用CSS样式,如例39-6所示。

39-6

这段代码创建了如图39-1的文本。

39-1

3-39-1 stroke_fill

要了解关于在JavaFX程序中使用CSS的更多细节,请参考第四部分《在JavaFX应用中使用CSS样式来管理外观》(Skinning JavaFX Applications with CSS)。

设置文本为粗体或斜体

如果要将文本的字体变粗,则可以使用font方法,传入FontWeight常量参数,如例39-7所示。

39-7

如果要显示斜体字,则可以使用FontPosture常量,如例39-8所示。

39-8

使用自定义字体

如果你需要使用某个可能未在其它电脑上安装的特殊字体,则可以在你的JavaFX程序中包含一个TrueType 字体(.ttf)文件或者OpenType(.otf)字体文件。

要添加TrueType或者OpenType字体作为自定义字体,可以按照如下步骤:

· 在你的工程文件夹下创建resources/fonts文件夹。

· 将字体文件拷贝到上面创建的fonts文件夹下。

· 在代码中加载自定义字体,如例39-9所示。

39-9

这段代码为Text提供了如图39-2所示的字体。

39-2

3-39-2 custom_font

设置LCD文本支持

LCD(liquid crystal display)文本是一种抗锯齿文本,它利用了LCD显示器的特性来显示更加光滑流畅的文本。你可以在Text Node上使用LCD文本的特性,如例39-10所示。

39-10

除此之外,你也可以通过下面的CSS语法在一个.css文件中提供这样的设置,如例39-11所示。

39-11

富文本和双向排列支持

你可以创建多个Text Node并使用TextFlow布局面板把它们放在一起。TextFlow对象采用了在其中的每个Text对象的文本和字体,但是会忽略其子节点的wrapping width、x和y属性。TextFlow对象使用它自己的宽度和文本对齐方式来决定每个子节点的位置。例39-12展示了在一个TextFlow面板中的3个拥有不同字体和文本的Text Node。

39-12

以上代码的输出如图39-3所示。

39-3

3-39-3 rich-text

你可以在一个TextFlow对象同时嵌入Text Noe以及其它对象,例如多个Shape和Image,或者创建带有双向(Bidirectional)支持的文本,如例39-13所示。

39-13

以上代码的输出结果如图39-4所示。

39-4

3-39-4 bidi-text

上例展示了一个Text Node在双向重排序功能的作用下,其内容是如何被分割开并且被放置到TextFlow的不同位置的。

TextFlow对象的默认排列方向是从左到右,但阿拉伯文字是从右至左。样例中有两个阿拉伯单词,红色的单词先放在了右边,然后蓝色的单词挨着放在了左边。

你可以通过调用如下方法来改变TextFlow的默认排列方向:

textFlow.setNodeOrientation(NodeOrientation.RIGHT_TO_LEFT);

注意Text和TextFlow对象都支持双向重排序功能,此功能的定义详见由Unicode协会(Unicode Consortium)制定的“双向排列算法附件9”(Bidirectional Algorithm Annex #9),其网址为http://www.unicode.org/reports/tr9/

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2015/04/doc03_text/
百度已收录