JavaFX:如何显示表情符号?

Posted

技术标签:

【中文标题】JavaFX:如何显示表情符号?【英文标题】:JavaFX: How can I display Emoji? 【发布时间】:2014-05-17 08:07:56 【问题描述】:

我现在一直在努力解决这个问题,但我似乎无法弄清楚。 我需要某种方式在 JavaFX 应用程序中显示表情符号(如在 WhatsApp 中)。

我用 awt 和 Swing 尝试过,但现在没有任何成功(编辑:swt 可以工作,但可能只适用于 Mac)我用扩展的 Unicode 和代码点尝试过,但这没有帮助。我希望它甚至是可能的,因为 Windows 通常不允许你显示 Emoji(我自己使用 Mac)。

今天我偶然发现了this post about Emoji's in JavaFX 8。有人说他通过扩展javafx.scene.text.TextFlow 类实现了一种在JavaFX 中显示表情符号的方法。还有一个指向little presentation 的链接,从第57 张幻灯片开始,它稍微解释了这些所谓的EmojiFlow 对象。 但是我似乎找不到下载!

感谢大家的回答,我在这个问题上苦苦挣扎了这么久,也许这是不可能的

这是一个不工作的例子

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class Main extends Application 
    @Override
    public void start(Stage stage) 
        VBox root = new VBox();

            // I used TextFlow here because the article suggested
            // extending this class, but I know it's not working
            // just like this
        TextFlow textFlow = new TextFlow(new Text("Should be alien smiley: "
                + (char) 0xF47D));

            // casting a hex number to a char is equal to using "\uF47D"
        root.getChildren().add(textFlow);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    

    public static void main(String[] args) 
        launch(args);
    

【问题讨论】:

这只是 Windows 上的问题吗?在我的 Mac 上进行快速测试,将字符查看器中的表情符号粘贴到显示的 SWT 应用程序中,没有任何问题。 @greg-449 你是对的!它确实适用于 swt,当时我没有对其进行足够好的测试,或者我忘记了。但那是因为 swt 尽可能使用原生的东西,比如通常的 Mac 文本框,无论如何都可以显示笑脸。同样使用 SWT 将很难在其中执行我的应用程序,也许可以创建 swt 子视图? 这合法吗?我以为 Apple 已经获得了 Emoji 专利或其他什么? @OJKrylow 表情符号包含在 Unicode 版本 6 中 【参考方案1】:

按照以下步骤将表情符号添加为文本:

    前往https://apps.timwhitlock.info/emoji/tables/unicode 搜索您想要的任何表情符号并检查其字节码(例如\xF0\x9F\x98\x81)

    创建一个字节数组并为其添加字节码 例如。我正在使用这个表情符号:? 它的字节码是 \xF0\x9F\x98\x81 所以,


byte[] emojiByteCode = new byte[](byte)0xF0, (byte)0x9F, (byte)0x98, (byte)0x81;

    创建一个新字符串,

String emoji = new String(emojiByteCode, Charset.forName("UTF-8"));

    您可以将此字符串用作标签、按钮等来显示表情符号。

【讨论】:

【参考方案2】:

github上有一个项目pavlobu/emoji-text-flow-javafx它是一个JavaFX库,主要目的是允许用户使用扩展的TextFlow来显示表情符号。它有助于在运行 JavaFX 应用程序的不同平台上显示一致的表情符号图像。

我开发它是为了解决在基于 JavaFX 的 UI 应用程序中显示一致的跨平台表情符号的问题。 它还可以帮助您使用不同的表情符号图像包,您只需要下载带有您想要使用的表情符号包的 .jar 即可。 Here is a link

目前它包含以下表情符号样式包之一:

    openmoji twemoji emojitwo

您甚至可以使用自己的表情包编译这个库。 操作说明在README.md

【讨论】:

【参考方案3】:

有两种方法可以做到这一点:

    采用显示发射图标的字体(较少推荐) 使用文本流并解析文本,如下例所示:

(到目前为止我只为超链接做了)

https://bitbucket.org/kogs/javafx-xmpp-client/src/660b12b5c514034ce78e1f653ea265cd74a645c6/src/main/java/de/kogs/xmpp/client/controller/MessageParser.java?at=master

https://bitbucket.org/kogs/javafx-xmpp-client/src/660b12b5c514034ce78e1f653ea265cd74a645c6/src/main/java/de/kogs/xmpp/client/TextParsing/?at=master

简单说:

在文本中查找表情符号 (":)",":P"...),如果找到,则将 Imageview 添加到文本流,如果没有,则将 TextNode 添加到 TextFlow

-->

"这个文本被 :P 传递给解析器"

这个 -> 文本节点 文本->文本节点 ... :P -> 带有 :P 图像的 ImageView 到 -> 文本节点

【讨论】:

不使用字体无法缩放视图。使用 TextFlow 很酷,但您应该为所有找到的 sn-ps 使用基于表情符号的字体 是的,我认为你是对的。使用字体是执行此操作的最佳方式。 如果您支持的服务也具有自定义表情符号,则使用字体可能会变得困难,因为您可能希望所有表情符号大小相同,并且如果一些来自图像而其他来自字体, 排列尺寸很棘手。

以上是关于JavaFX:如何显示表情符号?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 javascript 检测表情符号

如何使用 javascript 检测表情符号

在iOS 9.0中以编程方式显示表情符号键盘

如何检查任何设备是不是支持表情符号?

如何在角度/离子应用程序中显示表情符号

如何在UILabel iOS中显示表情符号