JavaFX:如何显示表情符号?

10

我现在一直在苦苦挣扎这个问题,但似乎无法解决。我需要一种在JavaFX应用程序中显示表情符号(如WhatsApp)的方法。

我已经尝试使用awt和Swing,但都没有成功(编辑:Swt适用于Mac),我尝试使用扩展Unicode和代码点,但这并没有帮助。我希望它甚至可能是可能的,因为Windows通常不允许您显示表情符号(我自己使用Mac)。

今天我偶然发现了JavaFX 8中关于表情符号的帖子。那里有一个人说他通过扩展javafx.scene.text.TextFlow类实现了在JavaFX中显示表情符号的方法。还有一个链接到小型演示,从第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
@greg-449 你是对的!它确实可以使用 SWT,我当时没有充分测试或者忘了。但这是因为 SWT 在任何可能的情况下都使用本地组件,例如通常的 Mac 文本框,无论如何都可以显示表情符号。另外,使用 SWT 来开发我的应用程序会非常困难,也许可以创建 SWT 的子视图? - Kametrixom
这合法吗?我记得苹果专利了表情符号或类似的东西吧? - Oliver Jan Krylow
@OJKrylow 表情符号包含在 Unicode 6 版本中。 - greg-449
3个回答

2
在Github上有一个项目pavlobu/emoji-text-flow-javafx,这是一个JavaFX库,其主要目的是允许用户使用扩展TextFlow来显示表情符号,以解决JavaFX应用程序在不同平台上显示一致的表情符号的问题。它还帮助您使用不同的表情包,只需下载您想要使用的表情包的.jar文件。这里是下载链接。目前它已经预装了以下表情风格之一:
  1. openmoji
  2. twemoji
  3. emojitwo
您甚至可以编译此库与自己的表情包一起使用,具体说明在README.md中。

0

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

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

  2. 创建一个字节数组并将字节码添加到其中 例如,我正在使用此表情符号: 其字节码为\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"));
    
    
    1. 您可以使用此字符串作为标签、按钮等来显示表情符号。

    -1

    有两种方法可以实现:

    1. 使用显示表情符号的字体(不太推荐)。
    2. 使用Textflow并像下面的例子一样解析文本:

    (我目前只对超链接进行了解析)

    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添加到TextFlow中,否则将TextNode添加到TextFlow中

    -->

    “此文本传递给解析器:P”

    • This -> TextNode
    • text -> TextNode
    • ...
    • :P -> 带有:P图像的ImageView
    • to -> TextNode

    1
    通过不使用字体,您无法缩放视图。使用TextFlow很酷,但您应该为所有发现的片段使用基于Emoji的字体。 - Hendrik Ebbers
    是的,我认为你是正确的。使用字体是做这件事的最佳方式。 - Marcel
    使用字体可能会使支持的服务变得困难,因为您可能希望所有表情符号大小相同,如果有些来自图像而其他一些来自字体,则很难将它们的大小对齐。 - Hakanai

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接