在JavaFX CSS中指定外部字体

时间:2012-08-29 07:59:50

标签: css fonts javafx

是否可以在JavaFX应用程序中使用CSS指定字体?我有一个FXML场景和相应的CSS文件。在Java代码中,可以使用setFont方法指定字体:

text.setFont(Font.loadFont("file:resources/fonts/SourceSansPro-Bold.ttf", 12));

我尝试了不同的结构,例如:

-fx-font-family: url("../fonts/SourceSansPro-Bold.ttf");

但它不起作用。

6 个答案:

答案 0 :(得分:19)

我使用应用程序代码和CSS的组合来通过外部字体进行样式化。

我将loadFont调用置于重写的Application init方法中,以确保在应用程序中发生任何事情之前调用它。

Font.loadFont(CustomFontTest.class.getResource("TRON.TTF").toExternalForm(), 10);

要使用该字体,我在CSS中按字体系列引用字体:

.menu-bar {
    -fx-background-color: transparent;
    -fx-font-family: TRON;
    -fx-font-size: 40px;
}

.context-menu {
    -fx-font-family: TRON;
    -fx-background-color: transparent;
    -fx-font-size: 12px;
}

很好,CSS可以很好地调整字体大小。 即使以10的大小加载字体,字体也会正确调整为CSS -fx-font-size规范中指定的字体。

使用在应用程序初始化期间加载的Font通过CSS对标签进行内联样式设置也可以正常工作:

Label testControl = new Label("TRON");
testControl.setStyle("-fx-font-family: TRON; -fx-font-size: 120;");

从dafont下载TRON font并将其放在与CustomFontTest类相同的目录中,并由构建系统复制到构建输出目录。

将答案从我的答案复制到"Using Custom Fonts"上的论坛帖子。

答案 1 :(得分:14)

你接近解决方案:

-fx-font-family: 'Helvetica', Arial, sans-serif;

试试这个,它应该可以正常工作。


也许这会有所帮助? (我不是JavaFX的专家)

https://forums.oracle.com/forums/thread.jspa?messageID=10107625


修改

加载字体:

@font-face {
    font-family: Delicious;
    src: url('Delicious-Roman.otf');
}

将您的字体与-fx-

一起使用
-fx-font-family: 'Delicious';

答案 2 :(得分:4)

刚刚发现了一个细节: 在JavaFX-8中,如果要使用相同字体的常规和粗体变体,可以使用@ font-face的两个实例指定它们。然后你可以使用-fx-font-weight:bold;

@font-face {
    font-family: 'Droid Sans';
    src: url('DroidSans.ttf');
}

@font-face {
    font-family: 'Droid Sans Bold';
    src: url('DroidSans-Bold.ttf');
}

.root {
    -fx-font-family: 'Droid Sans'; 
}

.table-row-cell:focused .text {
    -fx-font-weight: bold;
}

答案 3 :(得分:1)

另一种方法是使用FileIUnputStream加载字体,因此您不需要使用css:

 @FXML
    private Label myLabel;

@Override
    public void initialize(URL arg0, ResourceBundle arg1){

Font myFont = null;

        try {
            myFont = Font.loadFont(new FileInputStream(new File("patch_to_font.ttf")), 10);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        myLabel.setFont(myFont);

}

答案 4 :(得分:0)

JavaFx CSS字体(导入.ttf):

/* import fonts */
@font-face {
    font-family: "Open Sans";
    font-style: normal;
    font-weight: 400;
    src: url("/fonts/OpenSans-Regular.ttf");
}
@font-face {
    font-family: "Open Sans Light";
    font-style: normal;
    font-weight: 300;
    src: url("/fonts/OpenSans-Light.ttf");
}
@font-face {
    font-family: "Open Sans Bold";
    font-style: normal;
    font-weight: 700;
    src: url("/fonts/OpenSans-Bold.ttf");
}
@font-face {
    font-family: "Open Sans ExtraBold";
    font-style: normal;
    font-weight: 900;
    src: url("/fonts/OpenSans-ExtraBold.ttf");
}

/* Set fonts */

.settings-name{
    -fx-font-size: 33px;
    -fx-font-family: "Open Sans Light";
    -fx-font-weight: 300;
    -fx-text-fill: #09f;
}

.settings-username{
    -fx-font-size: 19px;
    -fx-font-family: "Open Sans ExtraBold";
    -fx-font-weight: 900;
    -fx-text-fill: #09f;
}

答案 5 :(得分:0)

您需要将 Font.ttf 文件放在我们的 bin/<main application> folder 中,其中包含您应用程序的 .class db<>fiddle