如何在OS X上的JavaFX中显示表情符号?

我无法在Mac OS X上的JavaFX应用程序中显示表情符号。在Linux上,只要系统上有表情符号字符(Symbo,Noto Emoji),字体替换就会启动。

然而,在OS X上,没有这样的运气。 我尝试添加Symbola字体作为资源,只有在我将标签的字体更改为Symbola时才有效。 我不想这样做是因为:

  • Symbola是一种衬线字体,不符合我的应用程序的美感
  • 用户最终应该能够选择自己的字体

Apple有“Apple Color Emoji”字体。 如果我将标签设置为该字体,则会显示表情符号,但文本间距不稳定。

以下是查看问题的示例应用程序:

import javafx.application.Application; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 300, 130, Color.WHITE); GridPane gridpane = new GridPane(); gridpane.setPadding(new Insets(5)); // Add cat emoji Label label = new Label("\uD83D\uDC31"); GridPane.setHalignment(label, HPos.CENTER); gridpane.add(label, 0, 0); root.getChildren().add(gridpane); primaryStage.setScene(scene); primaryStage.show(); } } 

以上内容改编自JavaFX教程

黑色条形而不是猫表情符号

如您所见,显示黑条而不是🐱。

我真的很好奇如何解决这个问题。 在开创它的平台上没有表情符号支持总是让人觉得奇怪!

我认为默认的Apple Emoji字体(Apple Color Emoji)无法在JavaFX中呈现。 通常,字体为每个字符定义基于矢量的可视化。 有些字体使用图像作为特定字符。 Apple字体中的表情符号被定义为图像。 您可以通过在Pages或Keynote中添加表情符号来轻松测试它,并将字体大小更改为500左右。 通过这样做,您将看到表情符号是像素化的。 我认为Apple在字体中添加了几个尺寸的表情符号(如32px,64px,128px,256px)但是如果你把它做得足够大就可以看到像素。 在此处输入图像描述

我认为JavaFX无法呈现这种字体,只支持基于矢量的字体。 因此,表情符号不会在Mac上呈现。

您可以做什么:您可以向项目(在资源中)添加基于矢量的表情符号字体,并使用Java代码或使用CSS加载它(请参阅http://www.guigarage.com/2014/10/integrate-custom -fonts-javafx-application-using-css / )。 如果您通过使用CSS来完成它,您只需为“.text”类定义CSS规则并定义加载的字体。 通过这样做,您将为(大部分)应用程序中的所有文本设置字体。 在某些情况下,您需要一些额外的CSS规则才能真正显示自定义字体中显示的所有内容。

如果您只想在某些特殊点显示表情符号,可以检查使用JavaFX TextFlow是不是更好的方法(请参阅http://www.guigarage.com/2013/09/make-your-app-smile- d / )。 在这里,您可以解析文本并将其拆分为几个JavaFX文本节点,这些节点是TextFlow的一部分。 在这种情况下,您将在包含表情符号的一些文本节点中结束,并且您可以仅为此文本节点更改字体。 通过这样做,您的应用程序的其余部分可以以默认字体或您选择的任何字体显示。