2013-05-31 15 views
16

In primo luogo, sono piuttosto un nuovo tipo nella codifica. Ho bisogno di incorporare un carattere nella mia app basata su javaFXML e non so come farlo. Ho incollato il carattere, fontName.ttf in una cartella "risorse" nella radice dei sorgenti del mio progetto, ovvero App/src/app/resources. Ho impostato il CSS per il componente (testo) comeCome incorporare i font .ttf è JavaFx 2.2?

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

Ho anche provato ad aggiungere virgolette nel URL, cioè url("resources/fontName.ttf");, ma non funziona. Ho anche impostato l'ID css per il componente, in modo che non possa essere il problema. C'è qualche altro modo per farlo? Ho visto http://fxexperience.com/2010/05/how-to-embed-fonts/, ma non funziona dal momento che ho jdk 1.7 u21. Qualche idea per un modo corretto di incorporare i caratteri?

risposta

31

soluzione metodo

ho aggiornato il campione da Javafx How to display custom font in webview? per dimostrare con un vero e proprio tipo di carattere personalizzato nei controlli JavaFX stile usando CSS.

I punti chiave sono:

  1. Posizionare il carattere nella stessa posizione come la classe di applicazione e garantire i vostri posti di sistema costruirlo nel vostro pacchetto build binario (per esempio applicazione file jar).
  2. Caricare il carattere del codice nel codice JavaFX prima di applicare uno stile che lo utilizza. Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
  3. Per utilizzare il carattere personalizzato in una classe di stile, utilizzare l'attributo css -fx-font-family e fare semplicemente riferimento al nome del carattere (ad esempio in questo caso "TRON").
  4. Creare e caricare un foglio di stile che definisce le classi di stile.
  5. Applica classi di stile ai tuoi controlli.

Informazioni aggiuntive

Se si utilizza Java 8, si può essere interessati a Use web(Google) fonts in JavaFX.

Output di esempio che utilizza un carattere personalizzato

tronfonts

codice di esempio

L'esempio si basa su un tipo di carattere TRON.TTF che può essere scaricato da 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; 
} 

Su FXML Uso

Font.loadFont(url, size) è un metodo statico prendendo due parametri. Non penso che tu possa invocare font.loadFont da FXML e non lo consiglierei se poteste. Invece, carica il font in codice Java (come ho fatto nella mia risposta) prima di caricare il tuo FXML o foglio di stile che richiede il font.

+0

errore si avvicina e dice che non riesce a trovare il simbolo: 'loadFont' in classe' Font'. Sono previsti tre identificatori. (Ho importato font in fxml come 'import javafx.scene.text.Font;') –

+1

Aggiunta una sezione sull'uso FXML alla risposta. – jewelsea

+0

Errore. Guardalo qui: https://docs.google.com/document/d/1GSQeo8CHQhMEU_nS-gl6yWL1qQF4T08kYwPa_OELer4/edit?usp=sharing –

10

So che non hai chiesto per un modo programmatico puro usare un font TTF personalizzato in un'applicazione Java FX, ma ho pensato che forse aiuta a qualcuno di vedere una versione programmatico:

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

che ha fatto il lavoro per me. puoi posizionare il font ovunque desideri, assicurati di adattare il percorso.

si può trovare molto di più su using fonts inside java fx apps here.

HTH

Problemi correlati