文档



JavaFX:使用JavaFX UI组件

39 使用文本在JavaFX中

本章介绍如何在JavaFX应用程序中添加文本。

它还包括代码示例来说明所使用的API。

介绍

JavaFX应用程序的图形内容由组织在称为场景图的树状结构中的对象组成。场景图中的单个元素称为节点。节点可以处理不同类型的内容,包括文本。节点可以进行变换和动画。您还可以对节点应用各种效果。使用所有节点类型共有的功能,您可以提供满足现代富互联网应用程序(RIA)需求的复杂文本内容。

JavaFX SDK提供了用于显示文本的javafx.scene.text.Text类。 Text类继承自Node类。因此,您可以像对待其他节点一样对文本节点应用效果、动画和变换。由于Node类继承自Shape类,您可以像对待任何形状一样为文本节点设置描边或应用填充设置。

添加文本

要向应用程序添加文本对象,请使用示例39-1示例39-3中显示的任何构造函数。

示例39-1

Text t = new Text();
t.setText("这是一个文本示例");

示例39-2

Text t = new Text("这是一个文本示例");

示例39-3

Text t = new Text (10, 20, "这是一个文本示例");

示例39-3中的构造函数在指定的坐标处创建一个文本对象。

设置文本字体和颜色

在添加文本时,您还可以设置一些属性。要设置字体,可以使用javafx.scene.text.Font类的实例。 Font.font()方法使您能够指定字体系列名称和大小。您还可以设置文本颜色,如示例39-4所示。

示例39-4

t.setText("这是一个文本示例");
t.setFont(Font.font ("Verdana", 20));
t.setFill(Color.RED);

或者,您可能希望使用系统字体,这取决于平台。为此,请调用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-6

Text t = new Text ("描边和填充");
t.setId("fancytext");

此代码创建了图39-1中显示的文本。

有关在JavaFX应用程序中使用CSS的更多详细信息,请参见使用CSS为JavaFX应用程序设置外观

使文本加粗或斜体

要使文本加粗,可以使用font方法的FontWeight常量,如示例39-7所示。

示例39-7

t.setFont(Font.font("Verdana", FontWeight.BOLD, 70));

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

示例39-8

t.setFont(Font.font("Verdana", FontPosture.ITALIC, 20));

使用自定义字体

如果您需要使用一种可能未安装在其他计算机上的独特字体,可以在JavaFX应用程序中包含一个TrueType字体(.ttf)或OpenType(.otf)。

要将TrueType或OpenType字体作为自定义字体包含在项目中,请按照以下步骤进行:

  1. 在项目文件夹中创建一个resources/fonts文件夹。

  2. 将字体文件复制到项目的fonts子文件夹中。

  3. 在源代码中,按照示例39-9所示加载自定义字体。

    示例39-9

    text.setFont(Font.loadFont("file:resources/fonts/isadoracyr.ttf", 120));
    

此代码为图39-2中显示的文本提供了字体。

设置LCD文本支持

LCD(液晶显示)文本是一种利用LCD面板的特性来呈现更平滑文本的抗锯齿文本。您可以通过使用示例39-10中显示的API来利用文本节点上的LCD文本。

示例39-10

text.setFontSmoothingType(FontSmoothingType.LCD));

或者,您可以在.css文件中使用示例39-11中显示的语法来提供此设置。

示例39-11

.text { -fx-font-smoothing-type: lcd; } 

富文本和双向支持

您可以创建多个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);

请注意,TextTextFlow对象都支持Unicode联盟在双向算法附录#9中定义的双向重排序。

http://www.unicode.org/reports/tr9/

关闭窗口

目录

JavaFX:使用JavaFX UI组件

展开 折叠