另一个基本的JavaFX节点是Text节点,它允许我们在场景图上显示文本。要创建Text节点,请使用javafx.scene.text.Text类。
所有JavaFX场景节点都从javafx.scene.Node中扩展,并且它们继承了许多功能,例如缩放,翻译或旋转的功能。
Text节点的直接父对象是javafx.scene.shape.Shape类。可以在两个文本之间执行几何操作,如减法,相交或联合。还可以使用文本剪辑视口区域。

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.paint.Color;
  5. import javafx.scene.text.Text;
  6. import javafx.stage.Stage;
  7. public class Main extends Application {
  8. public static void main(String[] args) {
  9. Application.launch(args);
  10. }
  11. @Override
  12. public void start(Stage primaryStage) {
  13. primaryStage.setTitle("Drawing Text");
  14. Group root = new Group();
  15. Scene scene = new Scene(root, 300, 250, Color.WHITE);
  16. int x = 100;
  17. int y = 100;
  18. int red = 30;
  19. int green = 40;
  20. int blue = 50;
  21. Text text = new Text(x, y, "JavaFX 2.0");
  22. text.setFill(Color.rgb(red, green, blue, .99));
  23. text.setRotate(60);
  24. root.getChildren().add(text);
  25. primaryStage.setScene(scene);
  26. primaryStage.show();
  27. }
  28. }

image.png

旋转文本

请参考下面旋转文本的代码实现 -

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.paint.Color;
  5. import javafx.scene.text.Text;
  6. import javafx.stage.Stage;
  7. public class Main extends Application {
  8. public static void main(String[] args) {
  9. Application.launch(args);
  10. }
  11. @Override
  12. public void start(Stage primaryStage) {
  13. primaryStage.setTitle("Drawing Text");
  14. Group root = new Group();
  15. Scene scene = new Scene(root, 300, 250, Color.WHITE);
  16. int x = 100;
  17. int y = 100;
  18. int red = 30;
  19. int green = 40;
  20. int blue = 50;
  21. Text text = new Text(x, y, "JavaFX 2.0");
  22. text.setFill(Color.rgb(red, green, blue, .99));
  23. text.setRotate(60);
  24. root.getChildren().add(text);
  25. primaryStage.setScene(scene);
  26. primaryStage.show();
  27. }
  28. }

image.png

文本字体

JavaFX的Font API使我们能够更改字体样式和字体大小。参考下面的代码实现将文本加粗并设置为红色 -

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.effect.DropShadow;
  5. import javafx.scene.paint.Color;
  6. import javafx.scene.text.Font;
  7. import javafx.scene.text.FontWeight;
  8. import javafx.scene.text.Text;
  9. import javafx.stage.Stage;
  10. public class Main extends Application {
  11. public static void main(String[] args) {
  12. Application.launch(args);
  13. }
  14. @Override
  15. public void start(Stage primaryStage) {
  16. primaryStage.setTitle("");
  17. Group root = new Group();
  18. Scene scene = new Scene(root, 300, 250, Color.WHITE);
  19. Group g = new Group();
  20. Text t = new Text();
  21. t.setCache(true);
  22. t.setX(10.0);
  23. t.setY(70.0);
  24. t.setFill(Color.RED);
  25. t.setText("JavaFX");
  26. //FontWeight:粗细
  27. t.setFont(Font.font(null, FontWeight.BOLD, 32));
  28. g.getChildren().add(t);
  29. root.getChildren().add(g);
  30. primaryStage.setScene(scene);
  31. primaryStage.show();
  32. }
  33. }

image.png

示例

实现使用CHOCOLATE颜色和Font.SERIF的文本

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.paint.Color;
  5. import javafx.scene.shape.Circle;
  6. import javafx.scene.text.Font;
  7. import javafx.scene.text.Text;
  8. import javafx.stage.Stage;
  9. public class Main extends Application {
  10. public static void main(String[] args) {
  11. Application.launch(args);
  12. }
  13. @Override
  14. public void start(Stage primaryStage) {
  15. primaryStage.setTitle("Title");
  16. final Circle circ = new Circle(40, 40, 30);
  17. final Group root = new Group(circ);
  18. final Scene scene = new Scene(root, 800, 400, Color.BEIGE);
  19. final Text text1 = new Text(25, 25, "From: yiibai.com");
  20. text1.setFill(Color.CHOCOLATE);
  21. text1.setFont(Font.font(java.awt.Font.SERIF, 25));
  22. root.getChildren().add(text1);
  23. primaryStage.setScene(scene);
  24. primaryStage.show();
  25. }
  26. }

image.png

文字效果

DropShadow对象基于相对于Text节点的x,y偏移量定位。因此可以设置文本阴影的颜色。
以下代码显示了如何使用DropShadow来绘制文本。

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.effect.DropShadow;
  5. import javafx.scene.paint.Color;
  6. import javafx.scene.shape.Circle;
  7. import javafx.scene.text.Font;
  8. import javafx.scene.text.FontWeight;
  9. import javafx.scene.text.Text;
  10. import javafx.stage.Stage;
  11. public class Main extends Application {
  12. public static void main(String[] args) {
  13. Application.launch(args);
  14. }
  15. @Override
  16. public void start(Stage primaryStage) {
  17. primaryStage.setTitle("阴影");
  18. Group root = new Group();
  19. Scene scene = new Scene(root, 400, 250, Color.WHITE);
  20. Group g = new Group();
  21. DropShadow ds = new DropShadow();
  22. ds.setOffsetY(3.0);
  23. ds.setColor(Color.color(0.4, 0.4, 0.4));
  24. Text t = new Text();
  25. t.setEffect(ds);
  26. t.setCache(true);
  27. t.setX(10.0);
  28. t.setY(70.0);
  29. t.setFill(Color.RED);
  30. t.setText("JavaFX drop shadow...");
  31. t.setFont(Font.font(null, FontWeight.BOLD, 32));
  32. g.getChildren().add(t);
  33. root.getChildren().add(g);
  34. primaryStage.setScene(scene);
  35. primaryStage.show();
  36. }
  37. }

image.png

例-2

使用0.7f作为setFraction()方法参数并调用此方法,本质上是指定所希望显示70%的反射。
以下代码显示如何在文本上使用反射效果。

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.effect.Reflection;
  5. import javafx.scene.paint.Color;
  6. import javafx.scene.text.Font;
  7. import javafx.scene.text.FontWeight;
  8. import javafx.scene.text.Text;
  9. import javafx.stage.Stage;
  10. public class Main extends Application {
  11. public static void main(String[] args) {
  12. Application.launch(args);
  13. }
  14. @Override
  15. public void start(Stage primaryStage) {
  16. primaryStage.setTitle("");
  17. Group root = new Group();
  18. Scene scene = new Scene(root, 400, 250, Color.WHITE);
  19. Text t = new Text();
  20. t.setX(10.0);
  21. t.setY(50.0);
  22. t.setCache(true);
  23. t.setText("Reflections on JavaFX...");
  24. t.setFill(Color.RED);
  25. t.setFont(Font.font(null, FontWeight.BOLD, 30));
  26. Reflection r = new Reflection();
  27. r.setFraction(0.7);
  28. t.setEffect(r);
  29. root.getChildren().add(t);
  30. primaryStage.setScene(scene);
  31. primaryStage.show();
  32. }
  33. }

image.png
反射值范围从0(0%)到1(100%)。还可以通过setTopOffset()方法设置不透明节点部分和反射部分之间的空间。顶部偏移默认为0。
上面的代码生成以下结果。

实例-3

以下代码显示如何使用行分隔符对文本执行换行。

  1. import javafx.application.Application;
  2. import javafx.beans.property.SimpleStringProperty;
  3. import javafx.beans.property.StringProperty;
  4. import javafx.scene.Group;
  5. import javafx.scene.Scene;
  6. import javafx.scene.effect.InnerShadow;
  7. import javafx.scene.paint.Color;
  8. import javafx.scene.text.Font;
  9. import javafx.scene.text.FontWeight;
  10. import javafx.scene.text.Text;
  11. import javafx.stage.Stage;
  12. public class Main extends Application {
  13. public static void main(String[] args) {
  14. Application.launch(args);
  15. }
  16. @Override
  17. public void start(Stage primaryStage) {
  18. primaryStage.setTitle("Keyboard");
  19. Group root = new Group();
  20. Scene scene = new Scene(root, 530, 300, Color.WHITE);
  21. StringProperty statusProperty = new SimpleStringProperty();
  22. InnerShadow iShadow = new InnerShadow();
  23. iShadow.setOffsetX(3.5);
  24. iShadow.setOffsetY(3.5);
  25. Text status = new Text();
  26. status.setEffect(iShadow);
  27. status.setX(100);
  28. status.setY(50);
  29. status.setFill(Color.LIME);
  30. status.setFont(Font.font(null, FontWeight.BOLD, 35));
  31. status.setTranslateY(50);
  32. status.textProperty().bind(statusProperty);
  33. statusProperty.set("Line\nLine2\nLine3");
  34. root.getChildren().add(status);
  35. primaryStage.setScene(scene);
  36. primaryStage.show();
  37. }
  38. }

image.png

实例-4

以下代码显示如何设置文本换行宽度。

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.text.Font;
  5. import javafx.scene.text.Text;
  6. import javafx.stage.Stage;
  7. public class Main extends Application {
  8. @Override
  9. public void start(Stage stage) {
  10. Group root = new Group();
  11. Scene scene = new Scene(root, 300, 150);
  12. stage.setScene(scene);
  13. stage.setTitle("Sample");
  14. Text t = new Text(10, 50, "This is a test");
  15. t.setWrappingWidth(200);
  16. t.setText("First row Second row Second row Second row Second row Second row ");
  17. t.setFont(new Font(20));
  18. root.getChildren().add(t);
  19. stage.show();
  20. }
  21. public static void main(String[] args) {
  22. launch(args);
  23. }
  24. }

image.png