JavaFX: как я могу отображать эмодзи?

Я много боролся с этой проблемой сейчас, и я не могу понять это. Мне нужен способ отображения эмодзи (как в WhatsApp) в приложении JavaFX.

Я попробовал это с awt и Swing, и теперь у меня не было никакого успеха (EDIT: swt работает, но, вероятно, только для Mac). Я пробовал это с расширенным Unicode и Codepoints, но это не помогло. Я надеюсь, что это даже возможно, потому что Windows обычно не позволяет отображать эмодзи (сам я использую Mac).

Сегодня я наткнулся на это сообщение об эмодзи в JavaFX 8. Там парень говорит, что реализовал способ отображения Emoji в JavaFX, расширив класс javafx.scene.text.TextFlow. Также есть ссылка на небольшую презентацию и на 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);
    }
}

person Kametrixom    schedule 04.04.2014    source источник
comment
Это проблема только в Windows? Быстрый тест на моем Mac: вставка эмодзи из средства просмотра символов в приложение SWT отображается без проблем.   -  person greg-449    schedule 05.04.2014
comment
@ Грег-449 Ты прав! Это работает с swt, я не проверил его достаточно хорошо или забыл. Но это потому, что swt везде, где это возможно, использует нативные вещи, такие как обычное текстовое поле Mac, которое в любом случае может отображать смайлики. Кроме того, использование SWT было бы очень сложным для моего приложения, может быть, возможно создать подвиды swt?   -  person Kametrixom    schedule 05.04.2014
comment
Это вообще законно? Я думал, что Apple запатентовала смайлики или что-то в этом роде?   -  person Oliver Jan Krylow    schedule 05.04.2014
comment
Эмодзи @OJKrylow включены в версию 6 Unicode.   -  person greg-449    schedule 05.04.2014


Ответы (3)


На гитхабе есть проект pavlobu/emoji-text-flow-javafx — это библиотека для JavaFX, основная цель которой — позволить пользователям использовать расширенный TextFlow для отображения эмодзи. Это помогает отображать согласованные изображения смайликов на разных платформах, на которых работает приложение JavaFX.

Я разработал его, чтобы решить проблему согласованного отображения эмодзи на разных платформах в приложениях пользовательского интерфейса на основе JavaFX. Это также поможет вам использовать различные пакеты изображений смайликов, вам просто нужно загрузить .jar с пакетом смайликов, который вы хотите использовать. Вот ссылка

В настоящее время он упакован с одним из этих пакетов в стиле смайликов:

  1. openmoji
  2. twemoji
  3. смайлик

Вы даже можете скомпилировать эту библиотеку со своим собственным пакетом смайликов. Инструкции, как это сделать, находятся в README.md

person user14023280    schedule 30.07.2020

Выполните следующие действия, чтобы добавить эмодзи в виде текста:

  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};

  1. создать новую строку,

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

  1. Вы можете использовать эту строку в качестве метки, кнопки и т. д. для отображения эмодзи.
person Atharva Gulve    schedule 15.05.2021

Есть два способа сделать это:

  1. возьмите шрифт, который отображает эмитиконы (меньше рекомендаций)
  2. Используйте Textflow и проанализируйте текст, как в примере ниже:

(Я сделал это только для гиперссылок)

Отн. ="nofollow">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 -> ImageView с изображением :P в нем
  • в -> Текстовый узел
person Marcel    schedule 10.11.2014
comment
Не используя шрифты, вы не можете масштабировать представление. Использование TextFlow — это круто, но вы должны использовать шрифт на основе Emoji для всех найденных фрагментов. - person Hendrik Ebbers; 06.09.2015
comment
Да, я думаю, вы правы. Использование шрифта - лучший способ сделать это. - person Marcel; 14.09.2015
comment
Использование шрифта может затруднить работу, если служба, которую вы поддерживаете, также имеет собственные смайлики, потому что вы, вероятно, хотите, чтобы все смайлики были одинакового размера, и если некоторые из них взяты из изображений, а другие — из шрифта, сложно выровнять размеры. . - person Trejkaz; 05.11.2017