Как встраивать шрифты .ttf является JavaFx 2.2? - программирование
Подтвердить что ты не робот

Как встраивать шрифты .ttf является JavaFx 2.2?

Во-первых, я совсем новый парень в кодировании. Мне нужно встроить шрифт в мое приложение на основе javaFXML и не знаю, как это сделать. Я вставлял шрифт fontName.ttf в папку "resources" в корневой каталог источников моего проекта, т.е. App/src/app/resources. Я установил CSS для компонента (текста) как

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

Я также попытался добавить в url кавычки, т.е. url("resources/fontName.ttf");, но это не сработает. Я также установил идентификатор css для компонента, так что это не может быть проблемой. Есть ли другой способ сделать это? Я видел http://fxexperience.com/2010/05/how-to-embed-fonts/, но он не работает, так как у меня есть jdk 1.7 u21. Любые идеи для правильного способа встраивания шрифтов?

4b9b3361

Ответ 1

Подход к решению

Я обновил образец из Javafx Как отобразить пользовательский шрифт в веб-просмотре?, чтобы продемонстрировать использование собственного шрифта истинного типа в элементах управления JavaFX, стилизованных с использованием CSS.

Ключевые моменты:

  1. Поместите шрифт в то же место, что и класс приложения, и убедитесь, что ваша система сборки поместит его в ваш двоичный пакет сборки (например, файл jar приложения).
  2. Загрузите шрифт кода в код JavaFX, прежде чем применять стиль, который его использует. Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
  3. Чтобы использовать пользовательский шрифт в классе стиля, используйте атрибут -fx-font-family css и просто укажите имя шрифта (например, в данном случае "TRON").
  4. Создайте и загрузите таблицу стилей, которая определяет классы стилей.
  5. Примените классы стилей к своим элементам управления.

Дополнительная информация

Если вы используете Java 8, вас могут заинтересовать Использовать веб-шрифты (Google) в JavaFX.

Коллекции шрифтов

Если ваш файл шрифтов имеет формат .ttc и содержит несколько шрифтов в одном файле, используйте Font.loadFonts API (вместо Font.loadFont). Обратите внимание, что Font.loadFonts доступен только с JDK 9 и недоступен в более ранних выпусках.

Пример вывода с использованием пользовательского шрифта

tronfonts

Пример кода

В примере используется шрифт TRON.TTF, который можно загрузить с 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();
  }
}

заказ шрифта 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;
}

Об использовании FXML

Font.loadFont(url, size) - статический метод, принимающий два параметра. Я не думаю, что вы можете вызвать font.loadFont из FXML и не посоветуете это, если сможете. Вместо этого загрузите шрифт в коде Java (как я уже сделал в своем ответе), прежде чем загружать свой FXML или таблицу стилей, для которой требуется шрифт.

Ответ 2

Я знаю, что вы не просили чисто программный способ использовать собственный шрифт TTF в приложении java fx, но я подумал, что это может помочь кому-то увидеть программную версию:

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

Это сделало работу за меня. Вы можете размещать шрифт в любом месте, просто изменив путь.

Вы можете узнать больше об использовании шрифтов в приложениях java fx здесь.

НТН