2013-05-31 66 views
16

Thứ nhất, tôi là một người hoàn toàn mới trong việc viết mã. Tôi cần phải nhúng một phông chữ trong ứng dụng dựa trên javaFXML của tôi và không biết làm thế nào để làm điều đó. Tôi đã dán phông chữ, fontName.ttf vào thư mục "tài nguyên" trong thư mục gốc của các nguồn của dự án của tôi, tức là App/src/app/resources. Tôi đã thiết lập CSS cho thành phần (văn bản) nhưLàm thế nào để nhúng phông chữ .ttf là JavaFx 2.2?

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

Tôi cũng đã thử thêm ngoặc kép trong url, tức là url("resources/fontName.ttf");, nhưng nó không hoạt động. Tôi cũng đã đặt id css cho thành phần, do đó không thể là vấn đề. Có cách nào khác để làm việc này không? Tôi đã thấy http://fxexperience.com/2010/05/how-to-embed-fonts/, nhưng nó không hoạt động vì tôi có jdk 1,7 u21. Bất kỳ ý tưởng cho một cách chính xác để nhúng phông chữ?

Trả lời

31

Solution Approach

tôi cập nhật mẫu từ Javafx How to display custom font in webview? để chứng minh sử dụng một sự thật kiểu phông chữ tùy chỉnh trong điều khiển JavaFX theo kiểu sử dụng CSS.

Những điểm mấu chốt là:

  1. Đặt phông chữ trong cùng một vị trí như lớp ứng dụng của bạn và đảm bảo nơi xây dựng hệ thống của bạn nó trong xây dựng nhị phân của bạn gói (ví dụ ứng dụng file jar).
  2. Tải phông chữ mã trong mã JavaFX của bạn trước khi bạn áp dụng một kiểu sử dụng nó. Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
  3. Để sử dụng phông chữ tùy chỉnh trong lớp kiểu sử dụng thuộc tính css -fx-font-family css và chỉ tham chiếu tên phông chữ (ví dụ: trong trường hợp này là "TRON").
  4. Tạo và tải biểu định kiểu xác định các lớp kiểu.
  5. Áp dụng các lớp kiểu cho các điều khiển của bạn.

Thông tin bổ sung

Nếu bạn đang sử dụng Java 8, bạn có thể quan tâm đến Use web(Google) fonts in JavaFX.

Sample Output Sử dụng Tuỳ chỉnh Font

tronfonts

Mẫu Mã

Ví dụ dựa trên một phông chữ TRON.TTF mà bạn có thể tải về từ 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(); 
    } 
} 

tùy chỉnh 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; 
} 

On FXML Cách sử dụng

Font.loadFont(url, size) là một phương pháp tĩnh dùng hai tham số. Tôi không nghĩ rằng bạn có thể gọi font.loadFont từ FXML và sẽ không tư vấn cho nó nếu bạn có thể. Thay vào đó, tải phông chữ trong mã Java (như tôi đã làm trong câu trả lời của tôi) trước khi bạn tải bảng tính kiểu FXML hoặc kiểu yêu cầu phông chữ.

+0

Lỗi đi lên và nói không thể tìm thấy biểu tượng: 'loadFont' trong lớp 'Font'. Ba số nhận dạng được mong đợi. (Tôi đã nhập phông chữ trong fxml là 'import javafx.scene.text.Font;') –

+1

Đã thêm một phần về cách sử dụng FXML vào câu trả lời. – jewelsea

+0

Lỗi xuất hiện. Xem tại đây: https://docs.google.com/document/d/1GSQeo8CHQhMEU_nS-gl6yWL1qQF4T08kYwPa_OELer4/edit?usp=sharing –

10

tôi biết bạn đã không yêu cầu một cách chương trình thuần túy sử dụng một phông chữ tùy chỉnh TTF trong một ứng dụng java fx nhưng tôi nghĩ có lẽ nó sẽ giúp người nhìn thấy một phiên bản chương trình:

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

đó đã làm các công việc cho tôi. bạn có thể đặt phông chữ bất cứ nơi nào bạn muốn chỉ cần đảm bảo bạn thích ứng với đường dẫn.

bạn có thể tìm thấy rất nhiều thêm về using fonts inside java fx apps here.

HTH

Các vấn đề liên quan