39 使用文本在JavaFX中
本章介绍如何在JavaFX应用程序中添加文本。
它还包括代码示例来说明所使用的API。
介绍
JavaFX应用程序的图形内容由组织在称为场景图的树状结构中的对象组成。场景图中的单个元素称为节点。节点可以处理不同类型的内容,包括文本。节点可以进行变换和动画。您还可以对节点应用各种效果。使用所有节点类型共有的功能,您可以提供满足现代富互联网应用程序(RIA)需求的复杂文本内容。
JavaFX SDK提供了用于显示文本的javafx.scene.text.Text
类。 Text
类继承自Node
类。因此,您可以像对待其他节点一样对文本节点应用效果、动画和变换。由于Node
类继承自Shape
类,您可以像对待任何形状一样为文本节点设置描边或应用填充设置。
添加文本
要向应用程序添加文本对象,请使用示例39-1到示例39-3中显示的任何构造函数。
示例39-3中的构造函数在指定的坐标处创建一个文本对象。
设置文本字体和颜色
在添加文本时,您还可以设置一些属性。要设置字体,可以使用javafx.scene.text.Font
类的实例。 Font.font()
方法使您能够指定字体系列名称和大小。您还可以设置文本颜色,如示例39-4所示。
或者,您可能希望使用系统字体,这取决于平台。为此,请调用Font.getDefault()
方法。
在生产代码中,Oracle建议使用层叠样式表(CSS)设置样式。例如,要能够将线性渐变填充应用于文本对象,请将具有所需规则的样式添加到CSS中,如示例39-5所示。
示例39-5
#fancytext { -fx-font: 100px Tahoma; -fx-fill: linear-gradient(from 0% 0% to 100% 200%, repeat, aqua 0%, red 50%); -fx-stroke: black; -fx-stroke-width: 1; }
在您的代码中,创建一个文本对象,并从CSS中应用样式,如示例39-6所示。
此代码创建了图39-1中显示的文本。
有关在JavaFX应用程序中使用CSS的更多详细信息,请参见使用CSS为JavaFX应用程序设置外观。
使用自定义字体
如果您需要使用一种可能未安装在其他计算机上的独特字体,可以在JavaFX应用程序中包含一个TrueType字体(.ttf)或OpenType(.otf)。
要将TrueType或OpenType字体作为自定义字体包含在项目中,请按照以下步骤进行:
-
在项目文件夹中创建一个
resources/fonts
文件夹。 -
将字体文件复制到项目的
fonts
子文件夹中。 -
在源代码中,按照示例39-9所示加载自定义字体。
此代码为图39-2中显示的文本提供了字体。
设置LCD文本支持
LCD(液晶显示)文本是一种利用LCD面板的特性来呈现更平滑文本的抗锯齿文本。您可以通过使用示例39-10中显示的API来利用文本节点上的LCD文本。
或者,您可以在.css文件中使用示例39-11中显示的语法来提供此设置。
富文本和双向支持
您可以创建多个Text
节点,并使用TextFlow
布局面板将它们布局在单个文本流中。 TextFlow
对象使用每个Text
节点的文本和字体,但忽略其子节点的换行宽度和x和y属性。 TextFlow
对象使用自己的宽度和文本对齐方式来确定每个子节点的位置。 示例39-12显示了三个具有不同字体和文本的Text
节点在TextFlow
面板中布局。
示例39-12
String family = "Helvetica"; double size = 50; TextFlow textFlow = new TextFlow(); textFlow.setLayoutX(40); textFlow.setLayoutY(40); Text text1 = new Text("你好 "); text1.setFont(Font.font(family, size)); text1.setFill(Color.RED); Text text2 = new Text("粗体"); text2.setFill(Color.ORANGE); text2.setFont(Font.font(family, FontWeight.BOLD, size)); Text text3 = new Text(" 世界"); text3.setFill(Color.GREEN); text3.setFont(Font.font(family, FontPosture.ITALIC, size)); textFlow.getChildren().addAll(text1, text2, text3); Group group = new Group(textFlow); Scene scene = new Scene(group, 500, 150, Color.WHITE); stage.setTitle("富文本示例"); stage.setScene(scene); stage.show();
此代码提供了图39-3中显示的输出。
您可以在TextFlow
对象中嵌入形状和图像等对象,或者创建具有双向支持的文本,如示例39-13所示。
示例39-13
import javafx.application.Application; import static javafx.application.Application.launch; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.scene.text.TextFlow; import javafx.stage.Stage; public class JavaFXBidiText extends Application { @Override public void start(Stage stage) throws Exception { TextFlow textFlow = new TextFlow(); Font font = new Font("Tahoma", 48); Text text1 = new Text("他对我说\u0627\u0644\u0633\u0644\u0627\u0645"); text1.setFill(Color.RED); text1.setFont(font); Text text2 = new Text(" \u0639\u0644\u064a\u0643\u0645。"); text2.setFill(Color.BLUE); text2.setFont(font); textFlow.getChildren().addAll(text1, text2); Group group = new Group(textFlow); Scene scene = new Scene(group, 650, 150, Color.WHITE); stage.setTitle("双向文本示例"); stage.setScene(scene); stage.show(); }
这段代码创建了在图39-4中显示的输出。
这个例子展示了如何通过双向重排序,将单个Text
节点的内容分割并放置在TextFlow
对象的不同位置。
TextFlow
对象的默认方向是从左到右,阿拉伯语单词的渲染顺序是从右到左。有两个阿拉伯语单词需要一起渲染:红色单词首先在最右边位置渲染,然后从右向左渲染蓝色单词。
您可以通过调用以下方法更改TextFlow
对象的默认方向:
textFlow.setNodeOrientation(NodeOrientation.RIGHT_TO_LEFT);
请注意,Text
和TextFlow
对象都支持Unicode联盟在双向算法附录#9中定义的双向重排序。