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:如何显示表情符号?的主要内容,如果未能解决你的问题,请参考以下文章