web-dev-qa-db-fra.com

Comment intégrer des polices .ttf est JavaFx 2.2?

Premièrement, je suis un tout nouveau type de codage. J'ai besoin d'incorporer une police dans mon application basée sur javaFXML et je ne sais pas comment le faire. J'ai collé la police, fontName.ttf Dans un dossier "resources" à la racine des sources de mon projet, soit App/src/app/resources. J'ai défini le CSS du composant (texte) comme

#text {
    -fx-font-family: url(resources/fontName.ttf);
}

J'ai également essayé d'ajouter des virgules inversées dans l'url, c'est-à-dire url("resources/fontName.ttf");, mais cela ne fonctionne pas. J'ai également défini l'identifiant css du composant, ce qui ne peut pas être le problème. Existe-t-il un autre moyen de le faire? J'ai vu http://fxexperience.com/2010/05/how-to-embed-fonts/ , mais cela ne fonctionne pas depuis que j'ai jdk 1.7 u21. Avez-vous des idées pour incorporer correctement les polices?

23
Pratik Anand

Approche de la solution

J'ai mis à jour l'exemple de Javafx Comment afficher une police personnalisée dans la vue Web? pour démontrer l'utilisation d'une police de type vrai personnalisée dans les contrôles JavaFX stylisés à l'aide de CSS.

Les points clés sont:

  1. Placez la police au même emplacement que votre classe d'application et assurez-vous que votre système de génération la place dans votre package de génération binaire (par exemple, le fichier jar d'application).
  2. Chargez la police de code dans votre code JavaFX avant d'appliquer un style qui l'utilise. Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
  3. Pour utiliser la police personnalisée dans une classe de style, utilisez le -fx-font-family l'attribut css et il suffit de référencer le nom de la police (par exemple dans ce cas "TRON").
  4. Créez et chargez une feuille de style qui définit les classes de style.
  5. Appliquez des classes de style à vos contrôles.

Informations supplémentaires

Si vous utilisez Java 8, vous pourriez être intéressé par tiliser les polices Web (Google) dans JavaFX .

Collections de polices

Si votre fichier de police est dans .ttc format, contenant plusieurs polices dans un seul fichier, puis utilisez le Font.loadFonts API (au lieu de Font.loadFont). Notez que Font.loadFonts n'est disponible que depuis JDK 9 et n'est pas disponible dans les versions antérieures.

Exemple de sortie à l'aide d'une police personnalisée

tronfonts

Exemple de code

L'exemple repose sur une police TRON.TTF que vous pouvez télécharger depuis dafont .

CustomFontApp.Java

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.*;
import javafx.scene.layout.VBox;
import javafx.scene.text.*;
import javafx.stage.Stage;

// demonstrates the use of a custom font.
public class CustomFontApp extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage stage) {
    stage.setTitle("TRON Synopsis");

    // load the tron font.
    Font.loadFont(
      CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 
      10
    );

    Label title = new Label("TRON");
    title.getStyleClass().add("title");

    Label caption = new Label("A sci-fi flick set in an alternate reality.");
    caption.getStyleClass().add("caption");
    caption.setMaxWidth(220);
    caption.setWrapText(true);
    caption.setTextAlignment(TextAlignment.CENTER);

    VBox layout = new VBox(10);
    layout.setStyle("-fx-padding: 20px; -fx-background-color: silver");
    layout.setAlignment(Pos.CENTER);
    layout.getChildren().setAll(
      title,
      new ImageView(
        new Image(
          "http://ia.media-imdb.com/images/M/MV5BMTY5NjM2MjAwOV5BMl5BanBnXkFtZTYwMTgyMzA5.V1.SY317.jpg"
        )
      ),
      caption
    );

    // layout the scene.
    final Scene scene = new Scene(layout);
    scene.getStylesheets().add(getClass().getResource("custom-font-styles.css").toExternalForm());
    stage.setScene(scene);
    stage.show();
  }
}

custom-font-styles.css

/** file: custom-font-styles.css
 * Place in same directory as CustomFontApp.Java 
 */

.title {
    -fx-font-family: "TRON";
    -fx-font-size: 20;
}

.caption {
    -fx-font-family: "TRON";
    -fx-font-size: 10;
}

Sur l'utilisation FXML

Font.loadFont (url, size) est une méthode statique prenant deux paramètres. Je ne pense pas que vous puissiez invoquer font.loadFont depuis FXML et je ne le conseillerais pas si vous le pouviez. Au lieu de cela, chargez la police dans Java (comme je l'ai fait dans ma réponse) avant de charger votre FXML ou votre feuille de style qui nécessite la police.

44
jewelsea

Je sais que vous n'avez pas demandé une méthode purement programmatique pour utiliser une police TTF personnalisée dans une application Java fx mais j'ai pensé que cela pouvait aider quelqu'un à voir une version programmatique:

public class Test2 extends Application {

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

  public void start(final Stage primaryStage) {
    Group rootGroup = new Group();

    // create a label to show some text
    Label label = new Label("Demo Text");
    try { 
      // load a custom font from a specific location (change path!)
      // 12 is the size to use
      final Font f = Font.loadFont(new FileInputStream(new File("./myFonts/TRON.TTF")), 12);
      label.setFont(f); // use this font with our label
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }

    rootGroup.getChildren().add(label); 

    // create scene, add root group and show stage
    Scene scene = new Scene(rootGroup, 640, 480, Color.WHITE);
    primaryStage.setScene(scene);
    primaryStage.show();
  }
}

Cela a fait le travail pour moi. Vous pouvez placer la police où vous le souhaitez, assurez-vous simplement d'adapter le chemin.

Vous pouvez en savoir beaucoup plus sur en utilisant des polices à l'intérieur Java applications fx ici.

HTH

16
Chris