原文地址:DOC-03-39 在JavaFX中使用文字(Text) | JavaFX中文资料
导读
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对象
Text t = new Text();
t.setText("This is a text sample");
Text t = new Text("This is a text sample");
1 | Text t = new Text (10, 20, "This is a text sample"); |
例中的构造方法在前两个参数指定的坐标处创建了一个text对象。
设置文本字体和颜色
在添加Text的时候,你也可以为其设置一些属性。如果要设置字体,你可以使用一个javafx.scene.text.Font类的实例。Font.font()方法让你可以指定字体名称和大小。你也也可以设置文本颜色
t.setText("This is a text sample");
t.setFont(Font.font ("Verdana", 20));
t.setFill(Color.RED);
除此之外,你可能想要使用系统字体,其字体类型一般取决于平台类型。你可以通过调用Font.getDefault()方法来达到这个目的。
在实际的代码中,Oracle建议你使用CSS来设置样式。例如,如果要为你的Text对象应用线性渐变填充效果,则可以把所需的样式规则添加到你的CSS文件中
2 3 4 5 6 | #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; } |
在你的代码中可以创建Text对象并应用CSS样式
设置文本为粗体或斜体
如果要将文本的字体变粗,则可以使用font方法,传入FontWeight常量参数,如例
Java
1 | t.setFont(Font.font("Verdana", FontWeight.BOLD, 70)); |
如果要显示斜体字,则可以使用FontPosture常量
t.setFont(Font.font("Verdana", FontPosture.ITALIC, 20));
使用自定义字体
如果你需要使用某个可能未在其它电脑上安装的特殊字体,则可以在你的JavaFX程序中包含一个TrueType 字体(.ttf)文件或者OpenType(.otf)字体文件。
要添加TrueType或者OpenType字体作为自定义字体,可以按照如下步骤:
· 在你的工程文件夹下创建resources/fonts文件夹。
· 将字体文件拷贝到上面创建的fonts文件夹下。
· 在代码中加载自定义字体,如例所示。
1 | text.setFont(Font.loadFont("file:resources/fonts/isadoracyr.ttf", 120)); |
这段代码为Text提供了如图所示的字体。
图
设置LCD文本支持
LCD(liquid crystal display)文本是一种抗锯齿文本,它利用了LCD显示器的特性来显示更加光滑流畅的文本。你可以在Text Node上使用LCD文本的特性,如例所示。
例
1 | text.setFontSmoothingType(FontSmoothingType.LCD)); |
除此之外,你也可以通过下面的CSS语法在一个.css文件中提供这样的设置,如例所示。
例
CSS
1 | .text { -fx-font-smoothing-type: lcd; } |
富文本和双向排列支持
你可以创建多个Text Node并使用TextFlow布局面板把它们放在一起。TextFlow对象采用了在其中的每个Text对象的文本和字体,但是会忽略其子节点的wrapping width、x和y属性。TextFlow对象使用它自己的宽度和文本对齐方式来决定每个子节点的位置。例展示了在一个TextFlow面板中的3个拥有不同字体和文本的Text Node
String family = "Helvetica";
double size = 50;
TextFlow textFlow = new TextFlow();
textFlow.setLayoutX(40);
textFlow.setLayoutY(40);
Text text1 = new Text("Hello ");
text1.setFont(Font.font(family, size));
text1.setFill(Color.RED);
Text text2 = new Text("Bold");
text2.setFill(Color.ORANGE);
text2.setFont(Font.font(family, FontWeight.BOLD, size));
Text text3 = new Text(" World");
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("Hello Rich Text");
stage.setScene(scene);
stage.show();
你可以通过调用如下方法来改变TextFlow的默认排列方向:
textFlow.setNodeOrientation(NodeOrientation.RIGHT_TO_LEFT);