¿Cómo incrustar fonts .ttf es JavaFx 2.2?

En primer lugar, soy un tipo bastante nuevo en la encoding. Necesito incrustar una fuente en mi aplicación javaFXML y no sé cómo hacerlo. He pegado la fuente, fontName.ttf en una carpeta de “recursos” en la raíz de las fonts de mi proyecto, es decir, App/src/app/resources . He establecido el CSS para el componente (texto) como

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

También intenté agregar comillas en la url, es decir, url("resources/fontName.ttf"); , pero no funciona. También configuré el ID CSS para el componente, por lo que ese no puede ser el problema. ¿Hay alguna otra manera de hacerlo? He visto http://fxexperience.com/2010/05/how-to-embed-fonts/ , pero no funciona porque tengo jdk 1.7 u21. ¿Alguna idea para una forma correcta de insertar fonts?

Enfoque de solución

Actualicé la muestra de Javafx ¿Cómo mostrar la fuente personalizada en la vista web? para demostrar el uso de una fuente personalizada de tipo verdadero en controles JavaFX con estilo utilizando CSS.

Los puntos clave son:

  1. Coloque la fuente en la misma ubicación que su clase de aplicación y asegúrese de que su sistema de comstackción la ubique en su paquete de comstackción binario (por ejemplo, archivo jar de aplicación).
  2. Cargue la fuente del código en su código JavaFX antes de aplicar un estilo que lo use. Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
  3. Para usar la fuente personalizada en una clase de estilo, use el atributo -fx-font-family css y solo haga referencia al nombre de la fuente (por ejemplo, en este caso "TRON" ).
  4. Crea y carga una hoja de estilo que define las clases de estilo.
  5. Aplica clases de estilo a tus controles.

Información Adicional

Si está utilizando Java 8, puede interesarle Usar fonts web (Google) en JavaFX .

Salida de muestra usando una fuente personalizada

tronfonts

Código de muestra

El ejemplo se basa en una fuente TRON.TTF que puede descargar desde 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; } 

En el uso de FXML

Font.loadFont (url, size) es un método estático que toma dos parámetros. No creo que pueda invocar font.loadFont desde FXML y no lo aconsejaría si pudiera. En su lugar, cargue la fuente en código Java (como lo he hecho en mi respuesta) antes de cargar su FXML o hoja de estilos que requiere la fuente.

Sé que no solicitó una forma puramente programática para utilizar una fuente TTF personalizada en una aplicación java fx, pero pensé que tal vez ayuda a alguien a ver una versión programática:

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

que hizo el trabajo por mí. puedes colocar la fuente donde quieras solo asegúrate de adaptar la ruta.

puedes encontrar mucho más sobre el uso de fonts dentro de las aplicaciones java fx aquí.

HTH