web-dev-qa-db-ja.com

.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 idを設定したので、問題にはなりません。そうするための他の作業方法はありますか?私は http://fxexperience.com/2010/05/how-to-embed-fonts/ を見てきましたが、jdk 1.7 u21を使用しているため機能しません。フォントを埋め込む正しい方法についてのアイデアはありますか?

23
Pratik Anand

ソリューションアプローチ

Javafxからサンプルを更新しました。CSSを使用してスタイル設定されたJavaFXコントロールでカスタムTrueTypeフォントを使用する方法を示すために、Webviewにカスタムフォントを表示する方法 .

重要なポイントは次のとおりです。

  1. フォントをアプリケーションクラスと同じ場所に配置し、ビルドシステムがフォントをバイナリビルドパッケージ(アプリケーションjarファイルなど)に配置するようにします。
  2. それを使用するスタイルを適用する前に、JavaFXコードにコードフォントをロードします。 Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
  3. スタイルクラスでカスタムフォントを使用するには、-fx-font-family css属性を使用し、フォントの名前(この場合は"TRON")を参照するだけです。
  4. スタイルクラスを定義するスタイルシートを作成してロードします。
  5. コントロールにスタイルクラスを適用します。

追加情報

Java 8を使用している場合、 JavaFX でweb(Google)フォントを使用する)に興味があるかもしれません。

フォントコレクション

フォントファイルが.ttc形式で、1つのファイルに複数のフォントが含まれている場合は、 Font.loadFonts API(Font.loadFontではなく)を使用します。 。 Font.loadFontsはJDK 9以降でのみ使用でき、以前のリリースでは使用できません。

カスタムフォントを使用したサンプル出力

tronfonts

サンプルコード

この例は、 dafont からダウンロードできるTRON.TTFフォントに依存しています。

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

FXMLの使用について

Font.loadFont(url、size) は、2つのパラメーターを取る静的メソッドです。 FXMLからfont.loadFontを呼び出すことはできないと思いますが、可能であればアドバイスしません。代わりに、フォントを必要とするFXMLまたはスタイルシートをロードする前に、フォントをJava=コード(私の回答で行ったように)でロードします。

44
jewelsea

Java fxアプリケーションでカスタムTTFフォントを使用するための純粋なプログラム的な方法を要求しなかったのを知っていましたが、おそらくそれが誰かがプログラム的なバージョンを見るのに役立つと思いました:

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アプリはここにあります。

HTH

16
Chris