Comment afficher emoji dans JavaFX sur OS X?


J'ai du mal à faire afficher des emoji dans mon application JavaFX sur Mac OS X. Sous Linux, tant que j'ai une police emoji (Symbola, Noto Emoji) sur le système, la substitution de police commencera.

Sur OS X, cependant, pas une telle chance. J'ai essayé d'ajouter la police Symbola en tant que ressource, et cela ne fonctionne que si je change la police de l'étiquette en Symbola. Je préférerais ne pas le faire parce que:

  • Symbola est une police à empattement et ne correspond pas à l'esthétique de mon demande
  • L'utilisateur devrait éventuellement pouvoir choisir sa propre police

Apple a la police "Apple Color Emoji". Si je définis mon étiquette cette police, emoji s'affichera mais l'espacement du texte est erratique.

Voici un exemple d'application pour voir le problème:

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

Ce qui précède a été adapté d'un tutoriel JavaFX

Barres noires au lieu du chat emoji

Comme vous pouvez le voir, les barres noires sont affichées au lieu de

Author: Ted Morin, 2016-04-26

1 answers

Je pense que la police Apple Emoji par défaut (Apple Color Emoji) ne peut pas être rendue dans JavaFX. Normalement, une police définit une visualisation vectorielle pour chaque caractère. Certaines polices utilisent des images pour des caractères spécifiques. Les emojis dans la police Apple sont définis comme des images. Vous pouvez facilement le tester en ajoutant un emoji dans Pages ou Keynote et changer la taille de la police à 500 ou plus. Ce faisant, vous verrez que l'emoji est pixélisé. Je pense qu'Apple a ajouté chaque emoji dans plusieurs dimensions à la police (comme 32px, 64px, 128px, 256px) mais si vous la faites assez grande, vous pouvez voir les pixels. entrez la description de l'image ici

Je pense que JavaFX ne peut pas rendre ce type de police et ne prend en charge que les polices vectorielles. Par conséquent, l'emoji n'est pas rendu sur votre Mac.

Ce que vous pouvez faire: Vous pouvez ajouter une police emoji vectorielle à votre projet (dans les ressources) et la charger en code Java ou en utilisant CSS (voir http://www.guigarage.com/2014/10/integrate-custom-fonts-javafx-application-using-css/). Si vous l'avez fait en utilisant CSS, vous pouvez simplement définir une règle CSS pour le ".texte " classe et définir la police chargée. Ce faisant, vous définirez la police pour (la plupart) tous les textes de votre application. Il y a certains cas où vous avez besoin de règles CSS supplémentaires pour avoir vraiment tout montré dans votre police personnalisée.

Si vous souhaitez afficher les emojis uniquement à certains points spéciaux, vous pouvez vérifier si vous utilisez un JavaFX TextFlow n'est pas une meilleure approche (voir http://www.guigarage.com/2013/09/make-your-app-smile-d / ). Ici, vous pouvez analyser un texte et le diviser en plusieurs nœuds de texte JavaFX qui font partie d'un TextFlow. Dans ce cas, vous finirez par certains nœuds de texte qui contiennent un emoji et vous pouvez changer la police uniquement pour ces nœuds de texte. Ce faisant, le reste de votre application peut être affiché dans la police par défaut ou n'importe quelle police de votre choix.

 3
Author: Hendrik Ebbers, 2016-04-27 06:30:41