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?
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:
Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
-fx-font-family
l'attribut css et il suffit de référencer le nom de la police (par exemple dans ce cas "TRON"
).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
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.
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